#include // #include "testlib.h" using namespace std ; #define ft first #define sd second #define pb push_back #define all(x) x.begin(),x.end() #define ll long long int #define vi vector #define vii vector > #define pii pair #define plii pair, int> #define piii pair #define viii vector > #define vl vector #define vll vector > #define pll pair #define pli pair #define mp make_pair #define ms(x, v) memset(x, v, sizeof x) #define sc1(x) scanf("%d",&x) #define sc2(x,y) scanf("%d%d",&x,&y) #define sc3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define scll1(x) scanf("%lld",&x) #define scll2(x,y) scanf("%lld%lld",&x,&y) #define scll3(x,y,z) scanf("%lld%lld%lld",&x,&y,&z) #define pr1(x) printf("%d\n",x) #define pr2(x,y) printf("%d %d\n",x,y) #define pr3(x,y,z) printf("%d %d %d\n",x,y,z) #define prll1(x) printf("%lld\n",x) #define prll2(x,y) printf("%lld %lld\n",x,y) #define prll3(x,y,z) printf("%lld %lld %lld\n",x,y,z) #define pr_vec(v) for(int i=0;i=b; i--) #define ASST(x, l, r) assert( x <= r && x >= l ) #include #include const int mod = 1e9 + 7; int ADD(int a, int b, int m = mod) { int s = a; s += b; if( s >= m ) s -= m; return s; } int MUL(int a, int b, int m = mod) { return (1LL * a * b % m); } int power(int a, int b, int m = mod) { int res = 1; while( b ) { if( b & 1 ) { res = 1LL * res * a % m; } a = 1LL * a * a % m; b /= 2; } return res; } ll nC2(ll x) { return ( x * ( x - 1 ) / 2 ); } int get( ll x ) { int c = 0; while( x ) { c ++; x -= (x & -x); } return c; } const int maxn = 1e5 + 5; int n,m; ll Tree[4*maxn]; ll Lazy[4*maxn][4]; void adjust(int i,int lo,int hi) { int mid = (lo+hi) >> 1; if (Lazy[i][3]!=mod) { ll x = Lazy[i][3]; Lazy[i][3]=mod; Tree[2*i] = x; Lazy[2*i][3] = x; Tree[2*i+1] = x; Lazy[2*i+1][3] = x; } } void update(int i,int lo,int hi,int u,int v,int type,ll x) { if (v> 1; if (Lazy[i][3]!=mod) adjust(i,lo,hi); update(2*i,lo,mid,u,v,type,x); update(2*i+1,mid+1,hi,u,v,type,x); Tree[i] = (Tree[2*i]|Tree[2*i+1]); } ll query(int i,int lo,int hi,int u,int v) { if (v> 1; if (Lazy[i][3]!=mod) adjust(i,lo,hi); return (query(2*i,lo,mid,u,v) | query(2*i+1,mid+1,hi,u,v)); } void init(int i,int lo,int hi) { Tree[i]=0; Lazy[i][3]=mod; if (lo==hi) return; int mid = (lo+hi) >> 1; init(2*i,lo,mid); init(2*i+1,mid+1,hi); } void solve() { sc2( n, m ); init(1, 1, n); int t, x, l, r, z, c, y, k, K; ll ans = 0; while( m -- ) { sc1( t ); if( t == 1 ) { sc2( x, K ); z = x; c = 0; while( z ) { if( z != x && c <= K ) { update(1, 1, n, z, z, 3, (1LL << c)); if( z * 2 == x ) l = r = 2 * z + 1; else l = r = 2 * z; k = c + 1; } else { l = r = x; k = c; } r = min(r, n); while( l <= r && k <= K ) { update(1, 1, n, l, r, 3, (1LL << k)); k ++; l *= 2; r = r * 2 + 1; r = min(r, n); } x = z; z = z / 2; c ++; } } else if( t == 2 ) { sc2(x, y); ans = 0; while( x != y ) { if( x < y ) { ans |= query(1, 1, n, y, y); y /= 2; } else { ans |= query(1, 1, n, x, x); x /= 2; } } ans |= query(1, 1, n, x, x); ans -= ans % 2; pr1( get( ans ) ); } else { sc1(x); ans = 0; l = r = x; while( l <= r ) { ans |= query(1, 1, n, l, r); l *= 2; r = r * 2 + 1;r = min(r, n); } ans -= ans % 2; pr1( get( ans ) ); } } } int main() { solve(); return 0; }