Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. /*
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     freopen("carici.in", "r", stdin);
  9.  
  10.     //freopen(".in", "r", stdin);
  11.     //freopen(".out", "w", stdout);
  12.  
  13.     return 0;
  14. }
  15.  
  16.  */
  17.  
  18. #include <bits/stdc++.h>
  19.  
  20. using namespace std;
  21.  
  22. #define NMAX 100001
  23.  
  24. int n, t;
  25. map<int, int> position;
  26. int tree[NMAX];
  27.  
  28. int cnt;
  29. struct node {
  30.     int val;
  31.     int L, R;
  32.     int size;
  33. } nodes[2 * NMAX * 17]; // lg2 NMAX = 16,9...
  34.  
  35. int build(int lo, int hi) {
  36.     if (lo > hi) return 0;
  37.  
  38.     int idx = ++cnt;
  39.     int mid = (lo + hi) / 2;
  40.     nodes[idx] = (node) {mid, build(lo, mid - 1), build(mid + 1, hi), 0};
  41.     return idx;
  42. }
  43.  
  44. int update(int x, int val, int amount) {
  45.     if (x == 0) return 0;
  46.  
  47.     int idx = ++cnt;
  48.  
  49.     int L = nodes[x].L;
  50.     int R = nodes[x].R;
  51.     if (val < nodes[x].val) L = update(L, val, amount);
  52.     if (val > nodes[x].val) R = update(R, val, amount);
  53.  
  54.     nodes[idx] = (node) {nodes[x].val, L, R, nodes[x].size + amount};
  55.  
  56.     return  idx;
  57. }
  58.  
  59. int query(int x, int val) {
  60.     if (val < nodes[x].val) {
  61.         return query(nodes[x].L, val) + nodes[x].size - nodes[nodes[x].L].size;
  62.     }
  63.  
  64.     if (val > nodes[x].val) {
  65.         return query(nodes[x].R, val);
  66.     }
  67.  
  68.     return nodes[x].size - nodes[nodes[x].L].size;
  69. }
  70.  
  71. int main() {
  72.     freopen("carici.in", "r", stdin);
  73.  
  74.     cin >> n;
  75.  
  76.     tree[0] = build(1, n);
  77.     for (int i = 1; i <= n; i++) {
  78.         int x, posx;
  79.         cin >> x;
  80.  
  81.         posx = position[x];
  82.         if (posx != 0) {
  83.             tree[i] = update(update(tree[i - 1], posx, -1), i, 1);
  84.         } else {
  85.             tree[i] = update(tree[i - 1], i, 1);
  86.         }
  87.         position[x] = i;
  88.     }
  89.  
  90.     cin >> t;
  91.     int lo, hi;
  92.     while (t--) {
  93.         cin >> lo >> hi;
  94.         cout << query(tree[hi], lo) << "\n";
  95.     }
  96.  
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement