/* HDU 4911 ( Inversion ) http://acm.hdu.edu.cn/showproblem.php?pid=4911 线段树求逆序数 离散化 离散化 离散化! 重要的事情说三遍 嘤嘤嘤 */ #include <cstdio> #include <algorithm> #include <vector> using namespace std; const long long Nmax=1000005; long long n,k; long long num[Nmax]; long long ans; vector<long long> v; struct Node { long long l; long long r; long long data; }; Node tree[Nmax*4]; int getid(int x) { return lower_bound(v.begin(),v.end(),x)-v.begin()+1; } void build(long long root,long long l,long long r) { tree[root].l=l; tree[root].r=r; tree[root].data=0; if(l==r) return; long long ls=root<<1,rs=root<<1|1; long long mid=(l+r)>>1; build(ls,l,mid); build(rs,mid+1,r); } void init() { v.clear(); ans=0; build(1,1,n); } void push_up(long long root) { tree[root].data=tree[root<<1].data+tree[root<<1|1].data; } void update(long long root,long long l,long long r,long long data) { //prlong longf("%lld:%lld,%lld ",root,tree[root].l,tree[root].r); if(tree[root].l==l && tree[root].r==r) { tree[root].data+=data; return; } long long ls=root<<1,rs=root<<1|1,mid=(tree[root].l+tree[root].r)>>1; if(mid>=r) update(ls,l,r,data); else if(mid<r) update(rs,l,r,data); else { update(ls,l,mid,data); update(rs,mid+1,r,data); } push_up(root); } long long query(long long root,long long l,long long r) { if(tree[root].l>=l && tree[root].r <=r) return tree[root].data; long long ls=root<<1,rs=root<<1|1,mid=(tree[root].l+tree[root].r)>>1; if(mid>=r) return query(ls,l,r); else if(mid<l) return query(rs,l,r); else return query(ls,l,mid)+query(rs,mid+1,r); } int main() { //freopen("a.in","r",stdin); while(scanf("%lld%lld",&n,&k)==2) { init(); for(long long i=1;i<=n;i++) { scanf("%lld",&num[i]); v.push_back(num[i]); } sort(v.begin(),v.end()); v.erase(unique( v.begin(),v.end() ),v.end() ); //for(int i=0;i<v.size();i++) //printf("%d:%d ",i+1,getid(num[i])); int nummm=v.size(); for(int i=1;i<=n;i++) { int x=getid(num[i]); if(x!=nummm) ans+=query(1,x+1,nummm); update(1,x,x,1); } //ans=max(ans-k,0); if(ans>k) ans-=k; else ans=0; printf("%lld ",ans); } return 0; }