Friday, October 11, 2019

[UVA] 11235 - Frequent Values

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 11235 - Frequent Values
Source            : UVA Online Judge
Category          : Data Structure
Algorithm         : Segment Tree
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 100010;  
  6.   
  7. struct SegmentTree  
  8. {  
  9.       int maxCount;  
  10.       int maxCountValue;  
  11.       int startValue;  
  12.       int countStartValue;  
  13.       int endValue;  
  14.       int countEndValue;  
  15.   
  16.       SegmentTree(int maxCount = 0, int maxCountValue = 0, int startValue = 0, int countStartValue = 0, int endValue = 0, int countEndValue = 0)  
  17.             : maxCount(maxCount)  
  18.             , maxCountValue(maxCountValue)  
  19.             , startValue(startValue)  
  20.             , countStartValue(countStartValue)  
  21.             , endValue(endValue)  
  22.             , countEndValue(countEndValue) {}  
  23.   
  24.   
  25.       void assignLeaf(int x)  
  26.       {  
  27.             maxCount = 1;  
  28.             maxCountValue = x;  
  29.             startValue = x;  
  30.             countStartValue = 1;  
  31.             endValue = x;  
  32.             countEndValue = 1;  
  33.       }  
  34.       void marge(const SegmentTree &lchild, const SegmentTree &rchild)  
  35.       {  
  36.             if (lchild.startValue == 0 or lchild.endValue == 0)  
  37.             {  
  38.                   maxCount = rchild.maxCount;  
  39.                   maxCountValue = rchild.maxCountValue;  
  40.                   startValue = rchild.startValue;  
  41.                   countStartValue = rchild.countStartValue;  
  42.                   endValue = rchild.endValue;  
  43.                   countEndValue = rchild.countEndValue;  
  44.                   return;  
  45.             }  
  46.             if (rchild.startValue == 0 or rchild.endValue == 0)  
  47.             {  
  48.                   maxCount = lchild.maxCount;  
  49.                   maxCountValue = lchild.maxCountValue;  
  50.                   startValue = lchild.startValue;  
  51.                   countStartValue = lchild.countStartValue;  
  52.                   endValue = lchild.endValue;  
  53.                   countEndValue = lchild.countEndValue;  
  54.                   return;  
  55.             }  
  56.             if (lchild.endValue == rchild.startValue)  
  57.             {  
  58.                   int cnt = lchild.countEndValue + rchild.countStartValue;  
  59.                   maxCount = cnt;  
  60.                   maxCountValue = lchild.endValue;  
  61.                   if (maxCount < lchild.maxCount)  
  62.                   {  
  63.                         maxCount = lchild.maxCount;  
  64.                         maxCountValue = lchild.maxCountValue;  
  65.                   }  
  66.                   if (maxCount < rchild.maxCount)  
  67.                   {  
  68.                         maxCount = rchild.maxCount;  
  69.                         maxCountValue = rchild.maxCountValue;  
  70.                   }  
  71.                   startValue = lchild.startValue;  
  72.                   countStartValue = lchild.countStartValue;  
  73.                   if (lchild.startValue == rchild.startValue)  
  74.                   {  
  75.                         countStartValue = lchild.countStartValue + rchild.countStartValue;  
  76.                   }  
  77.                   endValue = rchild.endValue;  
  78.                   countEndValue = rchild.countEndValue;  
  79.                   if (rchild.endValue == lchild.endValue)  
  80.                   {  
  81.                         countEndValue = rchild.countEndValue + lchild.countEndValue;  
  82.                   }  
  83.                   return;  
  84.             }  
  85.             maxCount = lchild.maxCount;  
  86.             maxCountValue = lchild.maxCountValue;  
  87.             if (maxCount < rchild.maxCount)  
  88.             {  
  89.                   maxCount = rchild.maxCount;  
  90.                   maxCountValue = rchild.maxCountValue;  
  91.             }  
  92.             startValue = lchild.startValue;  
  93.             countStartValue = lchild.countStartValue;  
  94.             endValue = rchild.endValue;  
  95.             countEndValue = rchild.countEndValue;  
  96.       }  
  97. } Tree[maxn * 4];  
  98.   
  99. int arr[maxn];  
  100.   
  101. void build(int node, int a, int b)  
  102. {  
  103.       if (a == b) return void(Tree[node].assignLeaf(arr[a]));  
  104.       int lchild = node * 2;  
  105.       int rchild = lchild + 1;  
  106.       int mid = (a + b) / 2;  
  107.       build(lchild, a, mid);  
  108.       build(rchild, mid + 1, b);  
  109.       Tree[node].marge(Tree[lchild], Tree[rchild]);  
  110. }  
  111.   
  112. SegmentTree query(int node, int a, int b, int i, int j)  
  113. {  
  114.       if (a > j or b < i) return SegmentTree();  
  115.       if (a >= i and b <= j) return Tree[node];  
  116.       int lchild = node * 2;  
  117.       int rchild = lchild + 1;  
  118.       int mid = (a + b) / 2;  
  119.       SegmentTree p = query(lchild, a, mid, i, j);  
  120.       SegmentTree q = query(rchild, mid + 1, b, i, j);  
  121.       SegmentTree res;  
  122.       res.marge(p, q);  
  123.       return res;  
  124. }  
  125.   
  126. signed main()  
  127. {  
  128.       ios_base::sync_with_stdio(false);  
  129.       cin.tie(nullptr);  
  130.       cout.tie(nullptr);  
  131.   
  132.       #ifndef ONLINE_JUDGE  
  133.             freopen("in.txt""r", stdin);   
  134.       #endif // ONLINE_JUDGE  
  135.   
  136.       int n;  
  137.       while (cin >> n)  
  138.       {  
  139.             if (n == 0) break;  
  140.             int q;  
  141.             cin >> q;  
  142.             for (int i = 1; i <= n; i++) cin >> arr[i];  
  143.             build(1, 1, n);  
  144.             while (q--)  
  145.             {  
  146.                   int l, r;  
  147.                   cin >> l >> r;  
  148.                   if (l > r) swap(l, r);  
  149.                   SegmentTree seg = query(1, 1, n, l, r);  
  150.                   cout << seg.maxCount << '\n';  
  151.             }  
  152.       }  
  153. }