Advertisement
Guest User

Untitled

a guest
May 23rd, 2015
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1.  #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct Tree {
  6.     vector<int> f;
  7.  
  8.     Tree(int size = 0): f(size) {}
  9.  
  10.     int get(int pos) {
  11.         int sum = 0;
  12.         for (; pos >= 0; pos = (pos & (pos + 1)) - 1)
  13.             sum += f[pos];
  14.         return sum;
  15.     }
  16.    
  17.     int get(int l, int r) {
  18.         return get(r) - get(l - 1);
  19.     }
  20.  
  21.     void upd(int pos, int delta) {
  22.         for (; pos < f.size(); pos = (pos | (pos + 1)))
  23.             f[pos] += delta;
  24.     }
  25. };
  26.  
  27. const int N = 50 * 1000 + 10;
  28. const int BLOCK = 2000;
  29.  
  30. int a[N];
  31. char type[N];
  32. int l[N];
  33. int r[N];
  34. int n;
  35. int m;
  36. int ans[N];
  37. vector<int> atL[N];
  38. vector<int> atId[N];
  39. set<int> seen[N];
  40.  
  41. void solveBlock(int pos) {
  42.     int last = min(m, pos + BLOCK);
  43.     vector<int> have;
  44.     for (int i = 0; i < n; i++) {
  45.         atL[i].clear();
  46.         atId[i].clear();
  47.     }
  48.     for (int i = 0; i < 2 * BLOCK; i++)
  49.         seen[i].clear();
  50.     for (int i = pos; i < last; i++)
  51.         if (type[i] == 'M') {
  52.             have.push_back(a[l[i]]);
  53.             have.push_back(r[i]);
  54.         } else {
  55.             r[i]--;
  56.             if (l[i] <= r[i]) {
  57.                 atL[r[i]].push_back(l[i]);
  58.                 atId[r[i]].push_back(i);
  59.             }
  60.         }
  61.     sort(have.begin(), have.end());
  62.     have.resize(unique(have.begin(), have.end()) - have.begin());
  63.     for (int i = 0; i < n; i++) {
  64.         int p = lower_bound(have.begin(), have.end(), a[i]) - have.begin();
  65.         if (p != have.size() && have[p] == a[i])
  66.             seen[p].insert(i);
  67.     }
  68.     for (int i = pos; i < last; i++) {
  69.         if (type[i] == 'M') {
  70.             int old = a[l[i]];
  71.             int cur = r[i];
  72.             int p = l[i];
  73.             int pOld = lower_bound(have.begin(), have.end(), old) - have.begin();
  74.             int pCur = lower_bound(have.begin(), have.end(), cur) - have.begin();
  75.             seen[pOld].erase(p);
  76.             seen[pCur].insert(p);
  77.             a[p] = cur;
  78.         } else {
  79.             for (int p = 0; p < have.size(); p++) {
  80.                 auto it = seen[p].lower_bound(l[i]);
  81.                 if (it != seen[p].end() && *it <= r[i])
  82.                     ans[i]++;
  83.             }  
  84.         }
  85.     }
  86.     map<int, int> pred;
  87.     Tree tree(n);
  88.     for (int i = 0; i < n; i++) {
  89.         if (!binary_search(have.begin(), have.end(), a[i])) {
  90.             if (pred.count(a[i]))
  91.                 tree.upd(pred[a[i]], -1);
  92.             pred[a[i]] = i;
  93.             tree.upd(i, 1);
  94.         }
  95.         for (int j = 0; j < atL[i].size(); j++) {
  96.             int L = atL[i][j];
  97.             int id = atId[i][j];
  98.             ans[id] += tree.get(L, i);
  99.         }
  100.     }
  101. }
  102.  
  103. int main() {
  104.     scanf("%d%d", &n, &m);
  105.     for (int i = 0; i < n; i++)
  106.         scanf("%d", &a[i]);
  107.     for (int i = 0; i < m; i++) {
  108.         while (type[i] != 'M' && type[i] != 'Q')
  109.             scanf("%c", &type[i]);
  110.         scanf("%d%d", &l[i], &r[i]);
  111.     }
  112.     for (int i = 0; i < m; i += BLOCK)
  113.         solveBlock(i);  
  114.     for (int i = 0; i < m; i++)
  115.         if (type[i] == 'Q')
  116.             printf("%d\n", ans[i]);
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement