Monday, December 10, 2018

[toph.co] A Very Toph Problem

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : A Very Toph Problem
Source            : toph.co
Category          : Data Structure
Algorithm         : MO's Algorithm
Verdict           : Accepted
  1. #include <bits/stdc++.h>  
  2.    
  3. using namespace std;  
  4.    
  5. static const int naxn = 1e5 + 5;  
  6. static const int block = 320;  
  7.    
  8. struct mo  
  9. {  
  10.       int l, r, id;  
  11.       mo(int l = 0, int r = 0, int id = 0) : l(l), r(r), id(id) {}  
  12.       friend bool operator < (mo p, mo q)  
  13.       {  
  14.             int pb = p.l / block;  
  15.             int qb = q.l / block;  
  16.             if (pb != qb) return p.l < q.l;  
  17.             return (p.r < q.r) ^ (p.l / block % 2);  
  18.       }  
  19. } queries[naxn];  
  20.    
  21. int arr[naxn];  
  22. int f[naxn];  
  23. int ff[naxn];  
  24.    
  25. int l = 1, r = 0, ANS[naxn];  
  26. int maxi, mini;  
  27.    
  28. inline void add(int pos)  
  29. {  
  30.       int x = arr[pos];  
  31.       ff[f[x]]--;  
  32.       int pre = f[x];  
  33.       f[x]++;  
  34.       ff[f[x]]++;  
  35.       int now = f[x];  
  36.       if (now >= maxi) maxi = now;  
  37.       if (now <= mini) mini = now;  
  38. }  
  39.    
  40. inline void remov(int pos)  
  41. {  
  42.       int x = arr[pos];  
  43.       ff[f[x]]--;  
  44.       int pre = f[x];  
  45.       f[x]--;  
  46.       ff[f[x]]++;  
  47.       int now = f[x];  
  48.       if (now >= maxi) maxi = now;  
  49.       if (now <= mini) mini = now;  
  50. }  
  51.    
  52. int main()  
  53. {  
  54.       int n, q;  
  55.       scanf("%d %d", &n, &q);  
  56.       for (int i = 1; i <= n; i++) scanf("%d", &arr[i]);  
  57.       for (int i = 0; i < q; i++)  
  58.       {  
  59.             int a, b;  
  60.             scanf("%d %d", &a, &b);  
  61.             queries[i] = {a, b, i};  
  62.       }  
  63.       sort(queries, queries+q);  
  64.       maxi = 1;  
  65.       mini = 1234567;  
  66.       for (int i = 0; i < q; i++)  
  67.       {  
  68.             int L = queries[i].l;  
  69.             int R = queries[i].r;  
  70.             int ID = queries[i].id;  
  71.             while (l > L)   add(--l);  
  72.             while (r < R)   add(++r);  
  73.             while (l < L)   remov(l++);  
  74.             while (r > R)   remov(r--);  
  75.             for (int j = maxi; j >= 1; j--)  
  76.             {  
  77.                   if (ff[j] > 0)  
  78.                   {  
  79.                         maxi = j;  
  80.                         break;  
  81.                   }  
  82.             }  
  83.             for (int j = mini; j <= maxi; j++)  
  84.             {  
  85.                   if (ff[j] > 0)  
  86.                   {  
  87.                         mini = j;  
  88.                         break;  
  89.                   }  
  90.             }  
  91.             ANS[ID] = maxi - mini;  
  92.       }  
  93.       for (int i = 0; i < q; i++) printf("%d\n", ANS[i]);  
  94. }  
  95.    

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.