#include #include #include #define biti 10 #define maxdim 100005 #define mod 4001 using namespace std; int n; int a[maxdim],arb[biti][4*maxdim],change[biti][4*maxdim]; inline void propaga ( int *arb , int *change , const int &nod , const int &st , const int &dr ){ if ( change[nod] ){ int mij = (st+dr)>>1; if ( st != dr ){ int nodst = nod<<1; int noddr = nodst|1; change[nodst] ^= 1; arb[nodst] = mij-st+1-arb[nodst]; change[noddr] ^= 1; arb[noddr] = dr-mij-arb[noddr]; } change[nod] = 0; } } void update ( int *arb , int *change , int nod , int st , int dr , int a , int b ){ if ( a <= st && dr <= b ){ change[nod] ^= 1; arb[nod] = dr-st+1-arb[nod]; return ; } propaga(arb,change,nod,st,dr); int mij = (st+dr)>>1; int nodst = nod<<1; int noddr = nodst|1; if ( a <= mij ){ update(arb,change,nodst,st,mij,a,b); } if ( b > mij ){ update(arb,change,noddr,mij+1,dr,a,b); } arb[nod] = arb[nodst]+arb[noddr]; } void query ( int *arb , int *change , int nod , int st , int dr , int &sol , int a , int b ){ propaga(arb,change,nod,st,dr); if ( a <= st && dr <= b ){ sol += arb[nod]; return ; } int mij = (st+dr)>>1; int nodst = nod<<1; int noddr = nodst|1; if ( a <= mij ){ query(arb,change,nodst,st,mij,sol,a,b); } if ( b > mij ){ query(arb,change,noddr,mij+1,dr,sol,a,b); } arb[nod] = arb[nodst]+arb[noddr]; } int main () { #ifndef ONLINE_JUDGE freopen("queries.in","r",stdin); freopen("queries.out","w",stdout); #endif int operations; scanf("%d %d",&n,&operations); int x; for ( int i = 1 ; i <= n ; ++i ){ scanf("%d",&x); a[i] = x; for ( int b = 0 ; b < biti ; ++b ){ if ( a[i] & (1<