rt
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int n,m;
int arr[N];
int qz0[N],qz1[N];
int f[N][50],lg[N];
int ans(int l,int r){
int k=lg[r-l+1];
return max(f[l][k],f[r-(1<<k)+1][k]);
}
int main(){
// freopen("xxx.in","r",stdin);
// freopen("xxx.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&arr[i]);
if(arr[i]==0){
qz0[i]=qz0[i-1]+1;
qz1[i]=qz1[i-1];
}else if(arr[i]==1){
qz1[i]=qz1[i-1]+1;
qz0[i]=qz0[i-1];
}
}
for(int i=0;i<=n;i++){
f[i][0]=qz0[i]-qz1[i];
}
lg[0]=-1;
for(int i=1;i<=n;i++){
lg[i]=lg[i>>1]+1;
}
for(int k=1;k<=lg[n];k++){
for(int i=0;i+(1<<k)-1<=n;i++){
f[i][k]=max(f[i][k-1],f[i+(1<<(k-1))][k-1]);
}
}
int op,l,r;
while(m--){
scanf("%d%d%d",&op,&l,&r);
if(op==1){
printf("%d\n",qz1[r]-qz0[l-1]+ans(l-1,r));
}else if(op==2){
int a=qz0[r]-qz0[l-1],b=qz1[r]-qz1[l-1];
if(a>0&&b>0){
printf("2\n");
}else{
printf("1\n");
}
}
}
return 0;
}