Advertisement
mehedi1

WA - spoj - dquery

Aug 18th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define lchild v*2,l,m
  4. #define rchild v*2+1,m+1,r
  5. const int mxnn = 3e4+9;
  6. const int mxnq = 2e5+9;
  7. struct Data {
  8.     int l,r,id;
  9.     int res;
  10.     bool operator<(const Data other) {
  11.         return r<other.r;
  12.     }
  13. } qs[mxnq];
  14. int st[mxnn], A[mxnn], last[1000009];
  15.  
  16. void update(int v, int l, int r, int i, int val) {
  17.     if(l==r) {
  18.         st[v] = val;
  19.         return;
  20.     }
  21.     int m = (l+r)/2;
  22.     if(i<=m) update(lchild,i,val);
  23.     else update(rchild,i,val);
  24.     st[v] = st[v*2] + st[v*2+1];
  25. }
  26. int query(int v, int l, int r, int i, int j) {
  27.     if(l>=i && r<=j) return st[v];
  28.     int m = (l+r)/2;
  29.     if(j<=m) return query(lchild,i,j);
  30.     else if(i>m) return query(rchild,i,j);
  31.     else {
  32.         return query(lchild,i,m) + query(rchild,m+1,j);
  33.     }
  34. }
  35. // void dbg(int v, int l, int r) {
  36. //     printf("%d -> %d %d -> ", v, l, r);
  37. //     printf("%d\n", st[v]);
  38. //     if(l==r) return;
  39. //     int m=(l+r)/2;
  40. //     dbg(lchild);
  41. //     dbg(rchild);
  42. // }
  43.  
  44. int main() {
  45.     int n,q,m;
  46.     scanf("%d",&n);
  47.     for(int i=1;i<=n;++i) {
  48.         scanf("%d",&A[i]);
  49.     }
  50.  
  51.     scanf("%d",&m);
  52.     for(int i=1;i<=m;++i) {
  53.         scanf("%d %d",&qs[i].l,&qs[i].r);
  54.         qs[i].id = i;
  55.     }
  56.     sort(qs+1,qs+m+1);
  57.  
  58.     int j=1;
  59.     for(int i=1;i<=n;++i) {
  60.         if(last[A[i]]!=0) update(1,1,n,last[A[i]],0); //if found previously
  61.         update(1,1,n,i,1);
  62.         last[A[i]] = i;
  63.         while(j<=m && qs[j].r==i) {
  64.             qs[qs[j].id].res = query(1,1,n,qs[j].l,qs[j].r);
  65.             j++;
  66.         }
  67.  
  68.         // printf("%d\n", i);
  69.         // dbg(1,1,n);
  70.         // printf("\n");
  71.     }
  72.  
  73.     for(int i=1;i<=m;++i) {
  74.         printf("%d\n", qs[i].res);
  75.     }
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement