Advertisement
Guest User

Untitled

a guest
Apr 29th, 2016
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include<iostream>
  2. #include<cmath>
  3. #include<vector>
  4. using namespace std;
  5. #define SQRMX 501
  6. #define NMMX 50001
  7. int sqr,n,nsqr;
  8. long long tree[SQRMX+1][NMMX+1]={0};
  9. vector <int> a[SQRMX+1];
  10. int ready(int x, long long t[]){
  11.     long long s=0;
  12.     while(x){
  13.     s+=t[x];
  14.     x-=(x & -x);
  15.     }
  16.     return s;
  17. }
  18. int read(int x,int y){
  19.     long long s=0;
  20.     while(x){
  21.         s+=ready(y,tree[x]);
  22.         x-=(x & -x);
  23.     }
  24.     return s;
  25. }
  26. void updatey(int x, long long t[],int val){
  27.     while(x<=NMMX)
  28.     {
  29.         t[x]+=val;
  30.         x+=(x & -x);
  31.     }
  32. }
  33. void update(int x,int y,int val){
  34.     while(x<=SQRMX){
  35.         updatey(y,tree[x],val);
  36.         x+=(x&-x);
  37.     }
  38. }
  39. long long tot;
  40. void upd(int idx, int val){
  41.     idx--;int x=idx/sqr;
  42.     idx-=(x*sqr);
  43.    
  44.     x++;
  45.  
  46.     tot-=read(x-1,NMMX)-read(x-1,a[x][idx])+read(nsqr,a[x][idx]-1)-read(x,a[x][idx]-1);
  47.     for(int i=0;i<idx;++i)
  48.         if(a[x][i]>a[x][idx])--tot;
  49.     for(int i=idx+1; i<a[x].size();++i)
  50.         if(a[x][i]<a[x][idx])--tot;
  51.     update(x,a[x][idx],-1);
  52.     a[x][idx]=val;
  53.     tot+=read(x-1,NMMX)-read(x-1,a[x][idx])+read(nsqr,a[x][idx]-1)-read(x,a[x][idx]-1);
  54.     for(int i=0;i<idx;++i)
  55.         if(a[x][i]>a[x][idx])++tot;
  56.     for(int i=idx+1;i<a[x].size();++i)
  57.         if(a[x][i]<a[x][idx])++tot;
  58.     update(x,a[x][idx],1);
  59. }
  60. int main(){
  61.     int n;
  62.     scanf("%d",&n);
  63.     sqr=sqrt(n);
  64.     //if(n==1)
  65.     //exit(1);
  66.     int tmp;
  67.     tot=0;
  68.     nsqr=1;
  69.     for(int i=0,c=0;i<n;++i,++c){
  70.         if(c==sqr)
  71.             nsqr++,c=0;
  72.         scanf("%d",&tmp);
  73.         a[nsqr].push_back(tmp);
  74.         tot+=read(nsqr,NMMX)-read(nsqr,tmp);
  75.         update(nsqr,tmp,1);
  76.     }
  77.     int m;
  78.     scanf("%d",&m);
  79.     int u,v;
  80.     while(m--){
  81.         scanf("%d%d",&u,&v);
  82.         upd(u,v);
  83.         printf("%lld\n",tot);
  84.     }
  85.     //system("pause");
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement