Advertisement
Guest User

11235 - Frequent values

a guest
Oct 24th, 2023
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int mx = 1e5 + 5;
  4. struct Node
  5. {
  6.     int leftMost, rightMost, frLeftMost, frRightMost, ans;
  7.     Node() {}
  8.     Node(int a, int b, int c, int d, int e)
  9.     {
  10.         leftMost = a;
  11.         rightMost = b;
  12.         frLeftMost = c;
  13.         frRightMost = d;
  14.         ans = e;
  15.     }
  16. };
  17. void print(struct Node n)
  18. {
  19.     cout << n.leftMost << " " << n.frLeftMost << " " << n.rightMost << " " << n.frRightMost << " " << n.ans << endl;
  20. }
  21. struct Node tree[mx * 3];
  22. struct Node merge(struct Node leftNode, struct Node rightNode)
  23. {
  24.     if (leftNode.ans == 0)
  25.         return rightNode;
  26.     if (rightNode.ans == 0)
  27.         return leftNode;
  28.     struct Node cur;
  29.     cur.leftMost = leftNode.leftMost;
  30.     cur.rightMost = rightNode.rightMost;
  31.     if (leftNode.leftMost == rightNode.rightMost)
  32.     {
  33.         int tmp = leftNode.frLeftMost + rightNode.frRightMost;
  34.         cur.frLeftMost = tmp;
  35.         cur.frRightMost = tmp;
  36.         cur.ans = tmp;
  37.     }
  38.     else if (leftNode.leftMost == rightNode.leftMost)
  39.     {
  40.         cur.frLeftMost = leftNode.frLeftMost + rightNode.frLeftMost;
  41.         cur.frRightMost = rightNode.frRightMost;
  42.         cur.ans = max(cur.frLeftMost, rightNode.ans);
  43.     }
  44.     else if (leftNode.rightMost == rightNode.rightMost)
  45.     {
  46.         cur.frLeftMost = leftNode.frLeftMost;
  47.         cur.frRightMost = leftNode.frRightMost + rightNode.frLeftMost;
  48.         cur.ans = max(cur.frRightMost, leftNode.ans);
  49.     }
  50.     else if (leftNode.rightMost == rightNode.leftMost)
  51.     {
  52.         cur.frLeftMost = leftNode.frLeftMost;
  53.         cur.frRightMost = rightNode.frRightMost;
  54.         cur.ans = max({leftNode.ans, rightNode.ans, leftNode.frRightMost + rightNode.frLeftMost});
  55.     }
  56.     else
  57.     {
  58.         cur.frLeftMost = leftNode.frLeftMost;
  59.         cur.frRightMost = rightNode.frRightMost;
  60.         cur.ans = max(leftNode.ans, rightNode.ans);
  61.     }
  62.     return cur;
  63. }
  64. void build(int node, int segL, int segR, int a[])
  65. {
  66.     if (segL == segR)
  67.     {
  68.         tree[node].leftMost = a[segL];
  69.         tree[node].rightMost = a[segL];
  70.         tree[node].frLeftMost = 1;
  71.         tree[node].frRightMost = 1;
  72.         tree[node].ans = 1;
  73.         return;
  74.     }
  75.     int mid = segL + ((segR - segL) / 2);
  76.     int leftMostNode = node * 2;
  77.     int rightMostNode = leftMostNode + 1;
  78.     build(leftMostNode, segL, mid, a);
  79.     build(rightMostNode, mid + 1, segR, a);
  80.     tree[node] = merge(tree[leftMostNode], tree[rightMostNode]);
  81. }
  82. struct Node query(int node, int segL, int segR, int i, int j)
  83. {
  84.     if (segL > j || segR < i)
  85.         return Node(0, 0, 0, 0, 0);
  86.     if (segL >= i && segR <= j)
  87.     {
  88.         return tree[node];
  89.     }
  90.     int mid = segL + ((segR - segL) / 2);
  91.     int leftMostNode = node * 2;
  92.     int rightMostNode = leftMostNode + 1;
  93.     struct Node a = query(leftMostNode, segL, mid, i, j);
  94.     struct Node b = query(rightMostNode, mid + 1, segR, i, j);
  95.     return merge(a, b);
  96. }
  97. int main()
  98. {
  99.     int n, q;
  100.     while (cin >> n)
  101.     {
  102.         if (n == 0)
  103.             break;
  104.         cin >> q;
  105.         int a[n];
  106.         for (int i = 0; i < n; i++)
  107.             cin >> a[i];
  108.         build(1, 0, n - 1, a);
  109.         while (q--)
  110.         {
  111.             int l, r;
  112.             cin >> l >> r;
  113.             --l;
  114.             --r;
  115.             cout << query(1, 0, n - 1, l, r).ans << endl;
  116.         }
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement