Advertisement
hkshakib

Untitled

Mar 26th, 2020
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mx = 1e5+10;
  5. ll arr[mx],tree[mx*4],ans[50010];
  6. vector<ll>V;
  7. vector<pair<ll,pair<ll,ll> >>pa;
  8. void update(ll node,ll b,ll e,ll i,ll val)
  9. {
  10.     if(b==e)
  11.     {
  12.         tree[node] = val;
  13.         return;
  14.     }
  15.     ll mid = (b+e)/2;
  16.     ll left = node*2;
  17.     ll right = node*2+1;
  18.     if(b<=i && i<=mid)
  19.     {
  20.         update(left,b,mid,i,val);
  21.     }
  22.     else
  23.     {
  24.         update(right,mid+1,e,i,val);
  25.     }
  26.     tree[node] =tree[left]+tree[right];
  27. }
  28. ll query(ll node,ll b,ll e,ll i,ll j)
  29. {
  30.     if(i<=b && j>=e)
  31.     {
  32.         return tree[node];
  33.     }
  34.     if(j<b || i >e)
  35.         return 0;
  36.     ll mid =(b+e)/2;
  37.     ll left = node*2;
  38.     ll right = node*2+1;
  39.     ll p = query(left,b,mid,i,j);
  40.     ll q = query(right,mid+1,e,i,j);
  41.     return (p+q);
  42. }
  43. void clr()
  44. {
  45.     V.clear();
  46.     memset(tree,0,sizeof(tree));
  47.     memset(arr,-1,sizeof(arr));
  48.     pa.clear();
  49. }
  50. int main()
  51. {
  52.     ll t,cas=1;
  53.     scanf("%lld",&t);
  54.     while(t--)
  55.     {
  56.         ll n,q,r,l,c;
  57.         ll a,b;
  58.         scanf("%lld %lld",&n,&q);
  59.         clr();
  60.         V.push_back(0);
  61.         for(int i=1; i<=n; i++)
  62.         {
  63.             scanf("%lld",&a);
  64.             V.push_back(a);
  65.         }
  66.         for(int i=1; i<=q; i++)
  67.         {
  68.             scanf("%lld %lld",&a,&b);
  69.             pa.push_back(make_pair(b,make_pair(a,i)));
  70.         }
  71.         sort(pa.begin(),pa.end());
  72.         int j=0;
  73.         for(int i=0; i<q; i++)
  74.         {
  75.             r = pa[i].first;
  76.             l = pa[i].second.first;
  77.             c = pa[i].second.second;
  78.             while(j<r)
  79.             {
  80.                 j++;
  81.                 a = V[j];
  82.                 if(arr[a]==-1)
  83.                 {
  84.                     update(1,1,n,j,1);
  85.                     arr[a]=j;
  86.                 }
  87.                 else
  88.                 {
  89.                     update(1,1,n,arr[a],0);
  90.                     update(1,1,n,j,1);
  91.                     arr[a]=j;
  92.                 }
  93.             }
  94.             ll x = query(1,1,n,l,r);
  95.             ans[c]=x;
  96.         }
  97.         printf("Case %lld:\n",cas++);
  98.         for(int i=1; i<=q; i++)
  99.             printf("%lld\n",ans[i]);
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement