#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cstring>

#define vi   vector<int>
#define pb   push_back
#define vvi  vector<vector<int> >
#define pii  pair<int,int>
#define ll   long long 
#define vl   vector<ll>
#define vvl  vector<vector<ll> > 
#define mii  map<int,int> 
#define msi  map<string,int> 
#define vpii vector<pair<int,int> >
#define mp   make_pair
#define all(a)  a.begin(), a.end()
#define inf 0x7fffffff
#define lfc(a) 2*a+1
#define rfc(a) 2*a+2
#define s(i) scanf("%d",&i)
using namespace std;

ll tree[200005];
ll lazy[200005];
void build_tree(ll *arr,int b,int e,int node)
{
    if(b==e)
    {
        tree[node]=arr[b];
        return ;
    }
    int mid=(b+e)/2;
    build_tree(arr,b,mid,2*node+1);
    build_tree(arr,mid+1,e,2*node+2);
    tree[node]=(tree[2*node+1]+tree[2*node+2]);

}

//increment range [i,j] by v
void update_tree(ll *arr,int b,int e,int i,int j,int node)
{
    if(lazy[node]!=0)
    {
        tree[node]=((e-b+1)-tree[node]);//update it
        if(b!=e)
        {
            //pushes the lazy to its child
            lazy[lfc(node)]+=lazy[node];
            lazy[lfc(node)]%=2;
            lazy[rfc(node)]+=lazy[node];
            lazy[rfc(node)]%=2;
        }
        lazy[node]=0;//reset lazy of node
    }
    if(e<i||b>j)
    {
        return ;

    }
    if(b>=i&&e<=j)
    {
       tree[node]=((e-b+1)-tree[node]);
        if(b!=e)
        {
            lazy[lfc(node)]+=1;
            lazy[lfc(node)]%=2;
            lazy[rfc(node)]+=1;
            lazy[rfc(node)]%=2;
        }
        return ;
    }
    int mid=(b+e)/2;
    update_tree(arr,b,mid,i,j,lfc(node));
    update_tree(arr,mid+1,e,i,j,rfc(node));
    tree[node]=(tree[lfc(node)]+tree[rfc(node)]);

}

ll query_tree(ll *arr,int b,int e,int i,int j,int node)
{
     if(lazy[node]!=0)
    {
        tree[node]=((e-b+1)-tree[node]);//update it
        if(b!=e)
        {
            //pushes the lazy to its child
            lazy[lfc(node)]+=lazy[node];
            lazy[lfc(node)]%=2;
            lazy[rfc(node)]+=lazy[node];
            lazy[rfc(node)]%=2;
        }
        lazy[node]=0;//reset lazy of node
    }
    if(e<i||b>j)
    {
        return 0 ;

    }
    if(b>=i&&e<=j)
    {
       return tree[node];
        
    }
    int mid=(b+e)/2;
    ll p1=query_tree(arr,b,mid,i,j,lfc(node));
    ll p2=query_tree(arr,mid+1,e,i,j,rfc(node));
    return (p1+p2);

}
int main()
{
   // freopen("i.txt","r",stdin);
    int n;
    s(n);
    ll arr[n];
    memset(arr,0,8*n);
    memset(lazy,0,sizeof(lazy));
    memset(tree,0,sizeof(tree));
    int e;
    s(e);int a,b,c,d;
    for (int i = 0; i < e; ++i)
    {
        s(a);
        if(a==0)
        {
            s(b);s(c);
            update_tree(arr,0,n-1,b-1,c-1,0);
        }
        else
        {
            s(b);s(c);
            cout<<query_tree(arr,0,n-1,b-1,c-1,0)<<"\n";
        }
    }






    
}

