RT,题目在这里
我在ubuntu和windows下面都过编了,但是交上去就提示很诡异的错误,dalao们帮帮我吧orz
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
struct node{
int lv,rv,lenl,lenr,sum,len;
}t[maxn<<2];
int n,m;
void pushup(int pos){
t[pos].lv=t[pos<<1].lv;
t[pos].rv=t[pos<<1|1].rv;
t[pos].lenl=t[pos<<1].lenl;
t[pos].lenr=t[pos<<1|1].lenr;
t[pos].sum=max(t[pos<<1].sum,t[pos<<1|1].sum);
if(t[pos<<1].rv!=t[pos<<1|1].lv){
t[pos].sum=max(t[pos].sum,t[pos<<1].lenr+t[pos<<1|1].lenl);
if(t[pos<<1].sum==t[pos<<1].len){
t[pos].lenl=t[pos<<1].sum+t[pos<<1|1].lenl;
}
if(t[pos<<1|1].sum==t[pos<<1|1].len){
t[pos].lenr=t[pos<<1|1].sum+t[pos<<1].lenr;
}
}
}
void build(int l,int r,int pos){
t[pos].len=(r-l+1);
if(l==r){
t[pos].lv=t[pos].rv=1;
t[pos].lenl=t[pos].lenr=1;
t[pos].sum=1;
return;
}
int mid=(l+r)/2;
build(l,mid,pos<<1);
build(mid+1,r,pos<<1|1);
pushup(pos);
}
void change(int x,int l,int r,int pos){
if(l==r){
t[pos].lv^=1;
t[pos].rv=t[pos].lv;
return;
}
int mid=(l+r)/2;
if(x<=mid) change(x,l,mid,pos<<1);
if(x>mid) change(x,mid+1,r,pos<<1|1);
pushup(pos);
}
int main(void){
scanf("%d %d",&n,&m);
build(1,n,1);
int x;
while(m--){
scanf("%d",&x);
change(x,1,n,1);
printf("%d\n",max(t[1].sum,max(t[1].lenl,t[1].lenr)));
}
}