实现代码
#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<vector>
#include<queue>
#include<string>
#include <cmath>
#define mod 999997
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define father l , r , root
#define lowbit(x) ( x & ( - x ) )
using namespace std;
typedef long long ll;
const int maxn = 100100;
const int inf = 0x3f3f3f3f;
int num[maxn];
struct node{
int lbsum;
int lwsum;
int rbsum;
int rwsum;
int bsum;
int wsum;
int lazy;
}line[maxn<<2];
void push_up(int root,int l,int r){
int ql=root<<1;
int qr=root<<1|1;
int mid=(r+l)>>1;
int sl=mid-l+1;
int sr=r-mid;
line[root].lbsum=line[ql].lbsum;
line[root].rbsum=line[qr].rbsum;
if(line[root].lbsum==sl)
line[root].lbsum+=line[qr].lbsum;
if(line[root].rbsum==sr)
line[root].rbsum+=line[ql].rbsum;
line[root].bsum=max(max(line[ql].bsum,line[qr].bsum),line[ql].rbsum+line[qr].lbsum);
line[root].lwsum=line[ql].lwsum;
line[root].rwsum=line[qr].rwsum;
if(line[root].lwsum==sl)
line[root].lwsum+=line[qr].lwsum;
if(line[root].rwsum==sr)
line[root].rwsum+=line[ql].rwsum;
line[root].wsum=max(max(line[ql].wsum,line[qr].wsum),line[ql].rwsum+line[qr].lwsum);
}
void SWAP(int root){
swap(line[root].bsum,line[root].wsum);
swap(line[root].lbsum,line[root].lwsum);
swap(line[root].rbsum,line[root].rwsum);
}
void push_down(int root){
if(line[root].lazy==0)return ;
int ql=root<<1;
int qr=root<<1|1;
SWAP(ql);
line[ql].lazy=!line[ql].lazy;
SWAP(qr);
line[qr].lazy=!line[qr].lazy;
line[root].lazy=!line[root].lazy;
}
void change(int L,int R,int l,int r,int root){
if(L<=l&&R>=r){
SWAP(root);
line[root].lazy=!line[root].lazy;
return ;
}
push_down(root);
int mid=(l+r)>>1;
if(mid>=L)change(L,R,lson);
if(mid<R)change(L,R,rson);
push_up(root,l,r);
}
void build_tree(int l,int r,int root){
line[root].lazy=0;
if(l==r){
line[root].bsum=line[root].rbsum=line[root].lbsum=num[l];
line[root].wsum=line[root].rwsum=line[root].lwsum=!num[l];
return ;
}
int mid=(l+r)>>1;
build_tree(lson);
build_tree(rson);
push_up(root,l,r);
}
int query(int L,int R,int l,int r,int root){
if(L<=l&&R>=r){
return line[root].bsum;
}
push_down(root);
int mid=(l+r)>>1;
if(mid>=R)return query(L,R,lson);
if(mid<L)return query(L,R,rson);
int ls=query(L,R,lson);
int rs=query(L,R,rson);
int ll=line[root<<1].rbsum;
if(ll>=mid-L+1)ll=mid-L+1;
int rr=line[root<<1|1].lbsum;
if(rr>=R-mid)rr=R-mid;
return max(max(ls,rs),ll+rr);
}
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
}
build_tree(1,n,1);
int q;
scanf("%d",&q);
while(q--){
int flag,l,r;
scanf("%d%d%d",&flag,&l,&r);
if(flag){
change(l,r,1,n,1);
}else{
printf("%d\n",query(l,r,1,n,1));
}
}
}
return 0;
}