Guest User

D-Query SQRT-Decomposition

a guest
Jun 17th, 2015
1,212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define all(x) x.begin(), x.end()
  3. #define f(i,a,b) for(int i = (a); i <= (b); i++)
  4. #define pb push_back
  5. #define pii pair<int,int>
  6.  
  7. struct Query
  8. {
  9.     int l,r,id;
  10.     Query(int p1, int p2, int p3) : l(p1), r(p2), id(p3) {};
  11.     friend bool operator < (Query q1, Query q2)
  12.     {
  13.         if(q1.l/200 != q2.l/200) return q1.l/200 < q2.l/200;
  14.         return q1.r < q2.r;
  15.     }
  16. };
  17.  
  18. int A[30005], Ans[200005], C[1000005], N, Q;
  19. vector<Query> Queries;
  20.  
  21. int main()
  22. {
  23.     cin >> N;
  24.     f(i,1,N) scanf("%d",&A[i]);
  25.     cin >> Q;
  26.     f(i,1,Q)
  27.     {
  28.         int l,r;
  29.         scanf("%d%d",&l,&r);
  30.         Queries.pb(Query(l,r,i));
  31.     }
  32.     sort(all(Queries));
  33.     int ans = 0, a = 0, b = 0;
  34.     for(Query q : Queries)
  35.     {
  36.         int l = q.l, r = q.r, id = q.id;
  37.         while(b < r)
  38.         {
  39.             C[A[++b]]++;
  40.             if(C[A[b]] == 1) ans++;
  41.         }
  42.         while(b > r)
  43.         {
  44.             if(C[A[b]] == 1) ans--;
  45.             C[A[b--]]--;
  46.         }
  47.         while(a > l)
  48.         {
  49.             C[A[--a]]++;
  50.             if(C[A[a]] == 1) ans++;
  51.         }
  52.         while(a < l)
  53.         {
  54.             if(a>0 && C[A[a]] == 1) ans--;
  55.             C[A[a++]]--;
  56.         }
  57.  
  58.         Ans[id] = ans;
  59.     }
  60.  
  61.     f(i,1,Q) printf("%d\n", Ans[i]);
  62. }
Advertisement
Add Comment
Please, Sign In to add comment