Maruf_Hasan

frequent values

Mar 2nd, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.76 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. const int INF = 0x3f3f3f3f;
  6. const double EPS = 1e-10;
  7. const int MAX = 1<<17;
  8.  
  9. struct NODE { int mfreq, lfreq, rfreq; };
  10.  
  11. int a[MAX];
  12. struct NODE Tree[MAX<<1];
  13.  
  14. void init(int Node, int i, int j)
  15. {
  16. if(i==j)
  17. {
  18. Tree[Node].lfreq = Tree[Node].rfreq = Tree[Node].mfreq = 1;
  19. return;
  20. }
  21. int m = (i + j)>>1;
  22. init(Node<<1, i, m);
  23. init((Node<<1)+1, m+1, j);
  24. if(a[m]==a[m+1])
  25. {
  26. Tree[Node].lfreq = Tree[Node<<1].lfreq + Tree[(Node<<1)+1].lfreq * (a[i]==a[m]);
  27. Tree[Node].rfreq = Tree[(Node<<1)+1].rfreq + Tree[Node<<1].rfreq * (a[j]==a[m+1]);
  28. int temp = Tree[Node<<1].rfreq + Tree[(Node<<1)+1].lfreq;
  29. Tree[Node].mfreq = max(temp, max(Tree[Node<<1].mfreq, Tree[(Node<<1)+1].mfreq));
  30. }
  31. else
  32. {
  33. Tree[Node].lfreq = Tree[Node<<1].lfreq;
  34. Tree[Node].rfreq = Tree[(Node<<1)+1].rfreq;
  35. Tree[Node].mfreq = max(Tree[Node<<1].mfreq, Tree[(Node<<1)+1].mfreq);
  36. }
  37. }
  38.  
  39. int query(int Node, int i, int j, int u, int v)
  40. {
  41. if(u==i && v==j)
  42. return Tree[Node].mfreq;
  43. int m = (i+j)>>1;
  44. if(v <= m)
  45. return query(Node<<1, i, m, u, v);
  46. if(u > m)
  47. return query((Node<<1)+1, m+1, j, u, v);
  48. int leftv = query(Node<<1, i, m, u, m);
  49. int rightv = query((Node<<1)+1, m+1, j, m+1, v);
  50. if(a[m]==a[m+1])
  51. {
  52. int temp = min(Tree[Node<<1].rfreq, m-u+1) + min(Tree[(Node<<1)+1].lfreq, v-m);
  53. return max(temp, max(rightv, leftv));
  54. }
  55. else
  56. return max(leftv, rightv);
  57. }
  58.  
  59. int main()
  60. {
  61. int n, q, i, u, v;
  62. while(scanf("%d", &n)==1 && n)
  63. {
  64. scanf("%d", &q);
  65. for(i = 0; i < n; i++)
  66. scanf("%d", &a[i]);
  67. init(1, 0, n-1);
  68. for(i = 0; i < q; i++)
  69. {
  70. scanf("%d%d", &u, &v);
  71. if(u==v)
  72. printf("1\n");
  73. else
  74. printf("%d\n", query(1, 0, n-1, --u, --v));
  75. }
  76. }
  77. return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment