/*
维护区间内最大值和两端的结果
两种颜色一起计算会方便很多
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
int l,r;
int lw,rw;
int lb,rb;
int maxw,maxb;
bool change;
}tree[maxn<<2];
void pushup(int p){
//左边白色
tree[p].lw=tree[p<<1].lw;
if(tree[p].lw==tree[p<<1].r-tree[p<<1].l+1){
tree[p].lw+=tree[p<<1|1].lw;
}
//左边黑色
tree[p].lb=tree[p<<1].lb;
if(tree[p].lb==tree[p<<1].r-tree[p<<1].l+1){
tree[p].lb+=tree[p<<1|1].lb;
}
//右边白色
tree[p].rw=tree[p<<1|1].rw;
if(tree[p].rw==tree[p<<1|1].r-tree[p<<1|1].l+1){
tree[p].rw+=tree[p<<1].rw;
}
//右边黑色
tree[p].rb=tree[p<<1|1].rb;
if(tree[p].rb==tree[p<<1|1].r-tree[p<<1|1].l+1){
tree[p].rb+=tree[p<<1].rb;
}
tree[p].maxw=max(max(tree[p<<1].maxw,tree[p<<1|1].maxw),tree[p<<1].rw+tree[p<<1|1].lw);
tree[p].maxb=max(max(tree[p<<1].maxb,tree[p<<1|1].maxb),tree[p<<1].rb+tree[p<<1|1].lb);
}
void build(int p,int l,int r){
tree[p].l=l;
tree[p].r=r;
tree[p].change=false;
if(l==r){
int t;
scanf("%d",&t);
tree[p].maxb=tree[p].lb=tree[p].rb=t==1;
tree[p].maxw=tree[p].lw=tree[p].rw=t==0;
return;
}
int m=l+r>>1;
build(p<<1,l,m);
build(p<<1|1,m+1,r);
pushup(p);
}
void pushdown(int p){
if(tree[p].change){
swap(tree[p<<1].maxw,tree[p<<1].maxb);
swap(tree[p<<1].lw,tree[p<<1].lb);
swap(tree[p<<1].rw,tree[p<<1].rb);
swap(tree[p<<1|1].maxw,tree[p<<1|1].maxb);
swap(tree[p<<1|1].lw,tree[p<<1|1].lb);
swap(tree[p<<1|1].rw,tree[p<<1|1].rb);
tree[p<<1].change=!tree[p<<1].change;
tree[p<<1|1].change=!tree[p<<1|1].change;
tree[p].change=false;
}
}
void update(int p,int l,int r){
if(l<=tree[p].l&&tree[p].r<=r){
swap(tree[p].lw,tree[p].lb);
swap(tree[p].rw,tree[p].rb);
swap(tree[p].maxw,tree[p].maxb);
tree[p].change=!tree[p].change;
return;
}
pushdown(p);
int m=tree[p].l+tree[p].r >> 1;
if(l<=m) update(p<<1,l,r);
if(r>m) update(p<<1|1,l,r);
pushup(p);
}
int query(int p,int l,int r){
if(l<=tree[p].l&&tree[p].r<=r){
return tree[p].maxb;
}
pushdown(p);
int m=tree[p].l+tree[p].r >> 1;
int res=0;
if(l<=m) res=max(res,query(p<<1,l,r));
if(r>m) res=max(res,query(p<<1|1,l,r));
if(l<=m&&r>m) res=max(res,min(m-l+1,tree[p<<1].rb)+min(r-m,tree[p<<1|1].lb));
return res;
}
int main(){
int n,m,op,l,r;
scanf("%d",&n);
build(1,1,n);
scanf("%d",&m);
while(m--){
scanf("%d%d%d",&op,&l,&r);
if(op==1){
update(1,l,r);
}else printf("%d\n",query(1,l,r));
}
return 0;
}