Advertisement
Guest User

Queries - CRANQRYS - Cranium 2015

a guest
Feb 14th, 2015
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. /*  Sanchit Abrol  */
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. #define pb push_back
  6. #define mp make_pair
  7. #define all(X) (X).begin(),(X).end()
  8. #define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
  9. #define s(a) scanf("%d", &a)
  10.  
  11. struct node
  12. {
  13.     int n,l,r;
  14. }buf[100000000 + 4000];
  15.  
  16. int N,i,j,Q,a[1000000 + 100],roots[1000000 + 100],num;
  17. int insert(int id,int l,int r,int p,int v);
  18. int query(int id,int l,int r,int s,int e);
  19. inline void inp(int &n );
  20. inline void write(int x);
  21. unordered_map<int, int> pos;
  22.  
  23. int main()
  24. {
  25.     s(N);
  26.     roots[0] = 0;
  27.     for(i = 0; i < N; i++)
  28.     {
  29.         s(a[i]);
  30.         if(!pos[a[i]])
  31.             roots[i+1] = insert(roots[i],1,N,i+1,1);
  32.         else
  33.         {
  34.             int temproot = insert(roots[i],1,N,pos[a[i]],-1);
  35.             roots[i+1] = insert(temproot,1,N,i+1,1);
  36.         }
  37.         pos[a[i]] = i+1;
  38.     }
  39.     s(Q);
  40.     int ans = 0;
  41.     while(Q--)
  42.     {
  43.         int x,r;
  44.         s(x); s(r);        
  45.         x += ans;
  46.         ans = query(roots[r],1,N,x,r);
  47.         printf("%d\n", ans);
  48.     }  
  49.    
  50.     return 0;
  51. }
  52.  
  53. int insert(int id,int l,int r,int p,int v)
  54. {
  55.     int idx = ++num;
  56.     buf[idx] = buf[id];
  57.     if(l == r)
  58.     {
  59.         buf[idx].n += v;
  60.         return idx;
  61.     }
  62.     int mid = (l + r) / 2;
  63.     if(p <= mid) buf[idx].l = insert(buf[idx].l,l,mid,p,v);
  64.     else         buf[idx].r = insert(buf[idx].r,mid+1,r,p,v);
  65.     buf[idx].n = buf[buf[idx].l].n + buf[buf[idx].r].n;
  66.     return idx;
  67. }
  68.  
  69. int query(int id,int l,int r,int s,int e)
  70. {  
  71.     if(l == s && r == e)
  72.         return buf[id].n;
  73.     int mid = (l + r) / 2;
  74.     int ans = 0;
  75.     if(s <= mid)
  76.         ans += query(buf[id].l,l,mid,s,min(mid,e));
  77.     if(e > mid)
  78.         ans += query(buf[id].r,mid+1,r,max(s,mid+1),e);
  79.     return ans;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement