傳送門:POJ3368
注意到不降,於是序列一定是連續的。
然後就是傻逼題了。
代碼上的小細節見下。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
struct Node{
int ls,rs;
int lw,rw,w;
};
int root,num;
Node tree[1000005];
int da[1000005];
int y1,y2;
int n,m;
void MakeTree(int& root,int l,int r)
{
root=++num;
if(l==r){
tree[root].lw=tree[root].rw=tree[root].w=1;
return;
}
int mid=(l+r)/2;
MakeTree(tree[root].ls,l,mid);
MakeTree(tree[root].rs,mid+1,r);
if(da[mid]==da[mid+1]){
if(mid-l+1==tree[tree[root].ls].lw)
tree[root].lw=tree[tree[root].ls].lw+tree[tree[root].rs].lw;
else
tree[root].lw=tree[tree[root].ls].lw;
if(r-mid==tree[tree[root].rs].rw)
tree[root].rw=tree[tree[root].rs].rw+tree[tree[root].ls].rw;
else
tree[root].rw=tree[tree[root].rs].rw;
tree[root].w=max(max(tree[tree[root].ls].w,tree[tree[root].rs].w),tree[tree[root].ls].rw+tree[tree[root].rs].lw);
}
else{
tree[root].lw=tree[tree[root].ls].lw;
tree[root].rw=tree[tree[root].rs].rw;
tree[root].w=max(tree[tree[root].ls].w,tree[tree[root].rs].w);
}
}
void Debug(int root,int l,int r)
{
printf("%d %d %d %d %d\n",l,r,tree[root].w,tree[root].lw,tree[root].rw);
if(l==r)
return;
int mid=(l+r)/2;
Debug(tree[root].ls,l,mid);
Debug(tree[root].rs,mid+1,r);
}
int Query(int root,int l,int r,int& lw,int& rw)
{
if(y1<=l&&r<=y2){
lw=tree[root].lw;
rw=tree[root].rw;
return tree[root].w;
}
int mid=(l+r)/2;
int ans1,ans2;
int lw1,lw2,rw1,rw2;
if(y1<=mid)
ans1=Query(tree[root].ls,l,mid,lw1,rw1);
else
ans1=0,lw1=0,rw1=0;
if(mid<y2)
ans2=Query(tree[root].rs,mid+1,r,lw2,rw2);
else
ans2=0,lw2=0,rw2=0;
if(da[mid]==da[mid+1]){
if(mid-l+1==lw1)
lw=lw1+lw2;
else
lw=lw1;
if(r-mid==rw2)
rw=rw1+rw2;
else
rw=rw2;
return max(max(ans1,ans2),rw1+lw2);
}
lw=lw1;rw=rw2;
return max(ans1,ans2);
}
void Solve()
{
while(scanf("%d%d",&n,&m)==2){
int c,d;
for(int i=1;i<=n;i++)
scanf("%d",&da[i]);
MakeTree(root,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d",&y1,&y2);
if(y1>y2)
swap(y1,y2);
printf("%d\n",Query(1,1,n,c,d));
}
root=0,num=0;
for(int i=1;i<=2*n;i++)
tree[i].ls=tree[i].rs=0;
}
}
void Readdata()
{
freopen("loli.in","r",stdin);
}
void Close()
{
fclose(stdin);
fclose(stdout);
}
int main()
{
Readdata();
//Debug(1,1,n);
Solve();
Close();
return 0;
}