Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const double EPS = 1e-10;
- const int MAX = 1<<17;
- struct NODE { int mfreq, lfreq, rfreq; };
- int a[MAX];
- struct NODE Tree[MAX<<1];
- void init(int Node, int i, int j)
- {
- if(i==j)
- {
- Tree[Node].lfreq = Tree[Node].rfreq = Tree[Node].mfreq = 1;
- return;
- }
- int m = (i + j)>>1;
- init(Node<<1, i, m);
- init((Node<<1)+1, m+1, j);
- if(a[m]==a[m+1])
- {
- Tree[Node].lfreq = Tree[Node<<1].lfreq + Tree[(Node<<1)+1].lfreq * (a[i]==a[m]);
- Tree[Node].rfreq = Tree[(Node<<1)+1].rfreq + Tree[Node<<1].rfreq * (a[j]==a[m+1]);
- int temp = Tree[Node<<1].rfreq + Tree[(Node<<1)+1].lfreq;
- Tree[Node].mfreq = max(temp, max(Tree[Node<<1].mfreq, Tree[(Node<<1)+1].mfreq));
- }
- else
- {
- Tree[Node].lfreq = Tree[Node<<1].lfreq;
- Tree[Node].rfreq = Tree[(Node<<1)+1].rfreq;
- Tree[Node].mfreq = max(Tree[Node<<1].mfreq, Tree[(Node<<1)+1].mfreq);
- }
- }
- int query(int Node, int i, int j, int u, int v)
- {
- if(u==i && v==j)
- return Tree[Node].mfreq;
- int m = (i+j)>>1;
- if(v <= m)
- return query(Node<<1, i, m, u, v);
- if(u > m)
- return query((Node<<1)+1, m+1, j, u, v);
- int leftv = query(Node<<1, i, m, u, m);
- int rightv = query((Node<<1)+1, m+1, j, m+1, v);
- if(a[m]==a[m+1])
- {
- int temp = min(Tree[Node<<1].rfreq, m-u+1) + min(Tree[(Node<<1)+1].lfreq, v-m);
- return max(temp, max(rightv, leftv));
- }
- else
- return max(leftv, rightv);
- }
- int main()
- {
- int n, q, i, u, v;
- while(scanf("%d", &n)==1 && n)
- {
- scanf("%d", &q);
- for(i = 0; i < n; i++)
- scanf("%d", &a[i]);
- init(1, 0, n-1);
- for(i = 0; i < q; i++)
- {
- scanf("%d%d", &u, &v);
- if(u==v)
- printf("1\n");
- else
- printf("%d\n", query(1, 0, n-1, --u, --v));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment