#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b) ((a)>(b)?a:b)
#define min(a,b) ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define dx i+xx[k]
#define dy j+yy[k]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e6+19;
const int M=1e6+10;
const double eps=1e-5;
in int read(){ re int x=0,f=0;re char c=getchar(); while(!isdigit(c)) f|=(c=='-'),c=getchar(); while(isdigit(c)) x=(x<<3)+(x<<1)+c-'0',c=getchar(); return f?-x:x;}
in void write(re int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}
struct node{
int l,r;
int v,lazy;
}tree[N<<3];
int n,m,ans;
int L,R;
void build(int x,int l,int r){
tree[x].l=l;
tree[x].r=r;
if(l==r){
tree[x].v=0;
return ;
}
int mid=l+r>>1;
build(ls,l,mid);build(rs,mid+1,r);
tree[x].v=tree[ls].v+tree[rs].v;
}
void down(int x){
tree[ls].lazy+=tree[x].lazy;
tree[rs].lazy+=tree[x].lazy;
tree[ls].v+=tree[x].lazy*(tree[ls].r-tree[ls].l+1);
tree[rs].v+=tree[x].lazy*(tree[rs].r-tree[rs].l+1);
tree[x].v=0;
}
void add(int x){
if(tree[x].l>=L&&tree[x].r<=R){
tree[x].v+=(tree[x].r-tree[x].l+1);
tree[x].lazy++;
return ;
}
down(x);
int mid=tree[x].l+tree[x].r>>1;
if(L<=mid){
add(ls);
}
if(R>mid){
add(rs);
}
tree[x].v=tree[ls].v+tree[rs].v;
}
void ask(int x){
if(tree[x].l==tree[x].r){
ans=tree[x].v&1;
return ;
}
down(x);
int mid=tree[x].l+tree[x].r>>1;
if(L<=mid){
ask(ls);
}
else{
ask(rs);
}
}
signed main(){
n=read();m=read();
build(1,1,n);
for(int i=1;i<=m;i++){
int opt=read();
if(opt==1){
L=read();R=read();
add(1);
}
else{
L=read();
ask(1);
cout<<ans<<endl;
}
}
return 0;
}