Tarango

Rio and Inversions

Aug 2nd, 2016
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define MP make_pair
  5. #define CLR(x,y) memset(x,y,sizeof(x))
  6. #define SZ(x) ((int)(x).size())
  7. typedef long long vlong;
  8. const vlong inf = 2147383647;
  9. const vlong mod = 1000000007;
  10.  
  11. int n, q, a[10004], tt, uu, vv, ans;
  12. int prec[102][102], csum[102], rt, c[102];
  13.  
  14. void countSegmentInversion(int seg) {
  15.     int st = seg*rt;
  16.     int en = min(n,(seg+1)*rt), ans;
  17.     CLR(c,0); ans = 0;
  18.  
  19.     for (int i=st; i<en; i++) {
  20.         int tmp = 0;
  21.         for (int j = a[i]+1; j<100; j++) {
  22.             tmp += c[j];
  23.         }
  24.         ans += tmp;
  25.         c[a[i]]++;
  26.     } csum[seg] = ans;
  27.  
  28.     for (int i=0; i<100; i++) prec[seg][i] = c[i];
  29. }
  30.  
  31. int solve1(int st, int en, int c[]) {
  32.     int tmp = st/rt, ans = 0;
  33.     tmp++; tmp *= rt;
  34.  
  35.     if (en < tmp) {
  36.         for (int i=st; i<=en; i++) {
  37.             int tmp = 0;
  38.             for (int j=a[i]+1; j<100; j++) {
  39.                 tmp += c[j];
  40.             }
  41.             ans += tmp;
  42.             c[a[i]]++;
  43.         } return ans;
  44.     } else {
  45.         for (int i=st; i<tmp; i++) {
  46.             int tmp = 0;
  47.             for (int j=a[i]+1; j<100; j++) {
  48.                 tmp += c[j];
  49.             }
  50.             ans += tmp;
  51.             c[a[i]]++;
  52.         }
  53.         for ( ; tmp+rt<=en; tmp+=rt) {
  54.             int tot = 0;
  55.             for (int i=0; i<100; i++) tot += c[i];
  56.             for (int i=0; i<100; i++) {
  57.                 tot -= c[i];
  58.                 ans += ( prec[tmp/rt][i] * tot );
  59.                 c[i] += prec[tmp/rt][i];
  60.             }
  61.             ans += csum[tmp/rt];
  62.         }
  63.         for (int i=tmp; i<=en; i++) {
  64.             int tmp = 0;
  65.             for (int j=a[i]+1; j<100; j++) {
  66.                 tmp += c[j];
  67.             }
  68.             ans += tmp;
  69.             c[a[i]]++;
  70.         }
  71.  
  72.     }
  73.     return ans;
  74. }
  75.  
  76. int solve0() {
  77.     prec[uu/rt][a[uu]]--;
  78.     prec[vv/rt][a[vv]]--;
  79.     swap(a[uu],a[vv]);
  80.     prec[uu/rt][a[uu]]++;
  81.     prec[vv/rt][a[vv]]++;
  82.     countSegmentInversion(uu/rt);
  83.     countSegmentInversion(vv/rt);
  84.  
  85.     CLR(c,0);
  86.     int ans = solve1(0,n-1,c);
  87.  
  88.     prec[uu/rt][a[uu]]--;
  89.     prec[vv/rt][a[vv]]--;
  90.     swap(a[uu],a[vv]);
  91.     prec[uu/rt][a[uu]]++;
  92.     prec[vv/rt][a[vv]]++;
  93.     countSegmentInversion(uu/rt);
  94.     countSegmentInversion(vv/rt);
  95.  
  96.     return ans;
  97. }
  98.  
  99. int main () {
  100.     scanf("%d", &n);
  101.  
  102.     for (int i=0; i<n; i++) {
  103.         scanf("%d", &a[i]);
  104.     }
  105.  
  106.     rt = sqrt(n);
  107.     for (int i=0; i*rt < n; i++) {
  108.         countSegmentInversion(i);
  109.     }
  110.  
  111.     scanf("%d", &q);
  112.     while (q--) {
  113.         scanf("%d %d %d", &tt, &uu, &vv);
  114.         if (uu > vv) swap(uu,vv);
  115.         ans = 0;
  116.         CLR(c,0);
  117.  
  118.         if (tt == 0) {
  119.             ans = solve0();
  120.         } else {
  121.             if (uu != 0) {
  122.                 ans = solve1(0,uu-1,c);
  123.             }
  124.             if (vv != n-1) {
  125.                 ans += solve1(vv+1,n-1,c);
  126.             }
  127.         }
  128.         printf("%d\n", ans);
  129.     }
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment