查Bug到凌晨系列,下次一定要写仔细呀。
传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
const int MAXN = 100005;
struct Node {
int x,y;
int maxlen;
int llen,rlen;
}t[MAXN<<2];
int a[MAXN];
void Push_Up(int rt) {
//Update maxlen;
t[rt].maxlen = max(t[rt<<1].maxlen,t[rt<<1|1].maxlen);
if(a[t[rt<<1].y] == a[t[rt<<1|1].x])t[rt].maxlen = max(t[rt].maxlen,t[rt<<1].rlen+t[rt<<1|1].llen);
//Update llen;
t[rt].llen = t[rt<<1].llen;
if(t[rt<<1].llen == t[rt<<1].y - t[rt<<1].x + 1 && a[t[rt<<1].y] == a[t[rt<<1|1].x])
t[rt].llen += t[rt<<1|1].llen;
//Update rlen;
t[rt].rlen = t[rt<<1|1].rlen;
if(t[rt<<1|1].rlen == t[rt<<1|1].y - t[rt<<1|1].x + 1 && a[t[rt<<1].y] == a[t[rt<<1|1].x])
t[rt].rlen += t[rt<<1].rlen;
}
void Build(int x,int y,int rt) {
t[rt].x = x; t[rt].y = y;
if(x == y) {
t[rt].maxlen = 1;
t[rt].llen = 1;
t[rt].rlen = 1;
return ;
}
int mid = (x + y) >> 1;
Build(x,mid,rt<<1);
Build(mid+1,y,rt<<1|1);
Push_Up(rt);
}
int p;//Last right ;
int ans ;
int tempright;
int tempans;
void Query(int x,int y,int rt,int Left,int Right) {
if(x >= Left && y <= Right) {
//Update tempans;
//printf("x : %d y : %d\n",x,y);
tempans = t[rt].maxlen;
//printf("x : %d y : %d maxlen : %d Tempans : %d\n",t[rt].x,t[rt].y,t[rt].maxlen,tempans);
//printf("tempright : %d\n",tempright);
if(a[x] == a[p]) {
//puts("Hello");
//printf("p : %d a[p] : %d\n",p,a[p]);
//printf("x : %d\n",x);
tempans = max(tempans,tempright+t[rt].llen);
//printf("Tempans : %d\n",tempans);
}
//printf("Tempans : %d\n",tempans);
//Update ans;
ans = max(ans,tempans);
//Update tempright;
if(t[rt].rlen < y - x + 1) tempright = t[rt].rlen;
else {
if(a[x] == a[p]) {
tempright += t[rt].rlen;
}
else
tempright = t[rt].rlen;
//Important !!!!!!!
}
//printf("tempright : %d\n",tempright);
//Update p;
p = y;
return ;
}
int mid = (x + y) >> 1;
if(mid >= Left ) Query(x,mid,rt<<1,Left,Right);
if(mid < Right) Query(mid+1,y,rt<<1|1,Left,Right);
}
void print(int x,int y,int rt){
printf("Left : %d Right : %d maxlen : %d llen : %d rlen : %d\n",x,y,t[rt].maxlen,t[rt].llen,t[rt].rlen);
if(x == y) return ;
int mid = ( x + y ) >> 1;
print(x,mid,rt<<1);
print(mid+1,y,rt<<1|1);
}
void Deal_with() {
int n,q;
while(scanf("%d",&n),n) {
memset(t,0,sizeof(t));
scanf("%d",&q);
for(int i = 1 ; i <= n ; i++) {
scanf("%d",a+i);
// printf("%d ",a[i]);
}
//puts("");
Build(1,n,1);
//print(1,n,1);
int tempa,tempb;
for(int i = 1 ; i <= q ; i++) {
ans = 0; tempans = 0;tempright = 0;
scanf("%d %d",&tempa,&tempb);
//printf("%d %d\n",tempa,tempb);
p = tempa;
Query(1,n,1,tempa,tempb);
printf("%d\n",ans);
}
}
}
int main(void) {
//freopen("a.in","r",stdin);
//freopen("out.txt","w",stdout);
Deal_with();
}