#include using namespace std; using Int = long long; template inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template inline void chmax(T1 &a,T2 b){if(a; Int n; vector r,p,L,R; stack st; PersistentUnionFind(){} PersistentUnionFind(Int sz):n(sz),r(sz,1),p(sz,0){ iota(p.begin(),p.end(),0); L=R=p; } Int find(Int x){ return x==p[x]?p[x]:find(p[x]); } bool same(Int x,Int y){ return find(x)==find(y); } void unite(Int x,Int y){ x=find(x);y=find(y); st.emplace(-1,-1,-1,-1); if(x==y) return; if(r[x]; using range = edge; Int n,q; PersistentUnionFind puf; vector > edges; vector > prc; map cnt,app; DynamicConnectivity(){} DynamicConnectivity(Int n,Int q_):n(n),q(1),puf(n){ while(q>1; add(a,b,e,k*2+1,l,m); add(a,b,e,k*2+2,m,r); } void add(range &r,const edge &e){ add(r.first,r.second,e,0,0,q); } void build(){ for(auto &e:cnt){ if(!e.second) continue; prc.emplace_back(range(app[e.first],q),e.first); } for(auto &s:prc) add(s.first,s.second); } void exec(function &f,Int k=0){ for(auto &e:edges[k]) puf.unite(e.first,e.second); if(k struct BIT{ Int n; vector bit; //1-indexed BIT():n(-1){} BIT(Int n_,T d):n(n_),bit(n_+1,d){} T sum(Int i){ T s=bit[0]; for(Int x=i;x>0;x-=(x&-x)) s+=bit[x]; return s; } void add(Int i,T a){ if(i==0) return; for(Int x=i;x<=n;x+=(x&-x)) bit[x]+=a; } Int lower_bound(Int w){ if(w<=0) return 0; Int x=0,r=1; while(r0;k>>=1){ if(x+k<=n&&bit[x+k]>n>>q; vector a(n); for(Int i=0;i>a[i]; vector t(q),x(q); for(Int i=0;i>t[i]>>x[i],x[i]--; vector con(n,0); DynamicConnectivity G(n,q); for(Int i=0;i bit(n+1,0); for(Int i=0;i f= [&](Int i){ if(i>=q||t[i]==1||t[i]==2) return; if(t[i]==3){ bit.add0(x[i],1); return; } assert(t[i]==4); Int L=G.puf.getL(x[i]); Int R=G.puf.getR(x[i]); //cout<