#include using namespace std; using ll=long long; using ld=long double; using ull=unsigned long long; using uint=unsigned int; using pcc=pair; using pii=pair; using pll=pair; using pdd=pair; using tuplis=pair; using tuplis2=pair; template using pq=priority_queue,greater>; const ll LINF=0x1fffffffffffffff; const ll MOD=1000000007; const ll MODD=998244353; const int INF=0x3fffffff; const ld DINF=numeric_limits::infinity(); const ld EPS=1e-8; const vector four={{-1,0},{0,1},{1,0},{0,-1}}; #define _overload4(_1,_2,_3,_4,name,...) name #define _overload3(_1,_2,_3,name,...) name #define _rep1(n) for(ll i=0;i=0;i--) #define _rrep2(i,n) for(ll i=n-1;i>=0;i--) #define _rrep3(i,a,b) for(ll i=b-1;i>=a;i--) #define _rrep4(i,a,b,c) for(ll i=a+(b-a-1)/c*c;i>=a;i-=c) #define rrep(...) _overload4(__VA_ARGS__,_rrep4,_rrep3,_rrep2,_rrep1)(__VA_ARGS__) #define each(i,a) for(auto &i:a) #define sum(...) accumulate(range(__VA_ARGS__),0LL) #define dsum(...) accumulate(range(__VA_ARGS__),double(0)) #define _range(i) (i).begin(),(i).end() #define _range2(i,k) (i).begin(),(i).begin()+k #define _range3(i,a,b) (i).begin()+a,(i).begin()+b #define range(...) _overload3(__VA_ARGS__,_range3,_range2,_range)(__VA_ARGS__) #define _rrange(i) (i).rbegin(),(i).rend() #define _rrange2(i,k) (i).rbegin(),(i).rbegin()+k #define _rrange3(i,a,b) (i).rbegin()+a,(i).rbegin()+b #define rrange(...) _overload3(__VA_ARGS__,_rrange3,_rrange2,_rrange)(__VA_ARGS__) #define elif else if #define unless(a) if(!(a)) #define mp make_pair #define mt make_tuple #define INT(...) int __VA_ARGS__;in(__VA_ARGS__) #define LL(...) ll __VA_ARGS__;in(__VA_ARGS__) #define STR(...) string __VA_ARGS__;in(__VA_ARGS__) #define CHR(...) char __VA_ARGS__;in(__VA_ARGS__) #define DBL(...) double __VA_ARGS__;in(__VA_ARGS__) #define vec(type,name,...) vector name(__VA_ARGS__) #define VEC(type,name,size) vector name(size);in(name) #define vv(type,name,h,...) vector>name(h,vector(__VA_ARGS__)) #define VV(type,name,h,...) vector>name(h,vector(__VA_ARGS__));in(name) #define vvv(type,name,h,w,...) vector>>name(h,vector>(w,vector(__VA_ARGS__))) struct SETTINGS{SETTINGS(){cout< inline constexpr T min(vector &v){return *min_element(range(v));} inline char min(string &v){return *min_element(range(v));} template inline constexpr T max(vector &v){return *max_element(range(v));} inline char max(string &v){return *max_element(range(v));} inline constexpr ll intpow(const ll&a,const ll&b){if(b==0)return 1;ll ans=intpow(a,b/2);return ans*ans*(b&1?a:1);} inline constexpr ll modpow(const ll&a,const ll&b,const ll&mod=MOD){if(b==0)return 1;ll ans=modpow(a,b/2,mod);ans=ans*ans%mod;if(b&1)ans=ans*a%mod;return ans;} template inline constexpr bool update_min(T &mn,const T &cnt){if(mn>cnt){mn=cnt;return 1;}else return 0;} template inline constexpr bool update_max(T &mx,const T &cnt){if(mx &vec){ for(unsigned i = 0; i < vec.size(); i++) { int a; scan(a); vec[i] = a; } } template inline void scan(vector &vec); template inline void scan(array &vec); template inline void scan(pair &p); template inline void scan(T (&vec)[size]); template inline void scan(vector &vec){ for(auto &i : vec) scan(i); } template inline void scan(array &vec){ for(auto &i : vec) scan(i); } template inline void scan(pair &p){ scan(p.first); scan(p.second); } template inline void scan(T (&vec)[size]){ for(auto &i : vec) scan(i); } template inline void scan(T &a){ cin>>a; } inline void in(){} template inline void in(Head &head, Tail&... tail){ scan(head); in(tail...); } inline void print(){ putchar('\n'); } inline void print(const bool &a){ printf("%d", a); } inline void print(const int &a){ printf("%d", a); } inline void print(const unsigned &a){ printf("%u", a); } inline void print(const long &a){ printf("%ld", a); } inline void print(const long long &a){ printf("%lld", a); } inline void print(const unsigned long long &a){ printf("%llu", a); } inline void print(const char &a){ printf("%c", a); } inline void print(const char a[]){ printf("%s", a); } inline void print(const float &a){ printf("%.10f", a); } inline void print(const double &a){ printf("%.10lf", a); } inline void print(const long double &a){ printf("%.10Lf", a); } template void print(const vector &vec); template void print(const array &vec); template void print(const pair &p); template inline void print(const T (&vec)[size]); template void print(const vector &vec){ print(vec[0]); for(auto i = vec.begin(); ++i != vec.end(); ){ putchar(' '); print(*i); } } template void print(const array &vec){ print(vec[0]); for(auto i = vec.begin(); ++i != vec.end(); ){ putchar(' '); print(*i); } } template void print(const pair &p){ print(p.first); putchar(' '); print(p.second); } template inline void print(const T (&vec)[size]){ print(vec[0]); for(auto i = vec; ++i != end(vec); ){ putchar(' '); print(*i); } } template inline void print(const T &a){ cout << a; } inline bool out(){ putchar('\n'); return 0; } template inline bool out(const T &t){ print(t); putchar('\n'); return 0; } template inline bool out(const Head &head, const Tail&... tail){ print(head); putchar(' '); out(tail...); return 0; } template inline void err(T t){cerr<data,lazy; LazySegmentTreeMax(ll n){ size=1; while(size>i)i++; rrep(j,1,i){ ll a=at>>j; if(lazy[a]){ data[a*2]=lazy[a]; data[a*2+1]=lazy[a]; lazy[a*2]=lazy[a]; lazy[a*2+1]=lazy[a]; lazy[a]=0; } } } void set(ll l,ll r,ll val){ l+=size; r+=size; while(ldata,lazy; LazySegmentTreeMin(ll n){ size=1; while(size>i)i++; rrep(j,1,i){ ll a=at>>j; if(lazy[a]!=LINF){ data[a*2]=lazy[a]; data[a*2+1]=lazy[a]; lazy[a*2]=lazy[a]; lazy[a*2+1]=lazy[a]; lazy[a]=LINF; } } } void set(ll l,ll r,ll val){ l+=size; r+=size; while(l data; SegmentTree(ll n){ size = 1; while(size < n) size *= 2; data.resize(size * 2); } SegmentTree(vector v){ size = 1; while(size < v.size()) size *= 2; data.resize(size * 2); for(ll i = 0; i < v.size(); i++) data[size + i] = v[i]; for(ll i = size - 1; i > 0; i--) data[i] = data[i * 2] + data[i * 2 + 1]; } void add(ll at, ll val){ at += size; data[at] += val; while(at /= 2) data[at] += val; } ll get(ll l, ll r){ ll ans = 0; l += size; r += size; while(l < r){ if(l & 1) ans += data[l++]; if(r & 1) ans += data[--r]; l /= 2; r /= 2; } return ans; } }; signed main(){ LL(n,q); VEC(ll,a,n); a.insert(a.begin(),0); SegmentTree seg(a); LazySegmentTreeMax max(n+1); LazySegmentTreeMin min(n+1); rep(n+1){ max.set(i,i+1,i+1); min.set(i,i+1,i); } rep(q){ LL(a,x); if(a==1){ ll l=min.get(x,x+1),r=max.get(x+1,x+2); max.set(l,x+1,r); min.set(x+1,r,l); } elif(a==2){ ll l=min.get(x,x+1),r=max.get(x+1,x+2); max.set(l,x+1,x+1); min.set(x+1,r,x+1); } elif(a==3){ seg.add(x,1); } else{ out(seg.get(min.get(x,x+1),max.get(x,x+1))); } } }