#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define N 400030 int n,m,x,y,tot,xb,cnt,a[N][3],b[N],fa[N],rt[N],sum[N*18],ls[N*18],rs[N*18]; double LOG[N],mul[N*18]; int getint(){ char ch; int sum=0; for (ch=getchar();ch<'0' || ch>'9';ch=getchar()); for (;ch>='0' && ch<='9';ch=getchar()) sum=sum*10+ch-'0'; return sum; } inline int lower(int x){ int l=1,r=xb,mid,t; while (l<=r) if (b[mid=(l+r)>>1]<=x) l=(t=mid)+1; else r=mid-1; return t; } int gfa(int x){return x==fa[x]?x:fa[x]=gfa(fa[x]);} inline void update(int cur){ sum[cur]=sum[ls[cur]]+sum[rs[cur]]; mul[cur]=mul[ls[cur]]+mul[rs[cur]]; } void add(int &root,int l,int r,int x,double s,int cnt){ if (root==0) root=++tot; mul[root]+=s*cnt; sum[root]+=cnt; if (l==r) return; int mid=(l+r)>>1; if (x<=mid) add(ls[root],l,mid,x,s,cnt); if (x>mid) add(rs[root],mid+1,r,x,s,cnt); } int del(int root,int l,int r,int L,int R){ if (root==0) return 0; if (l==r){int t=sum[root]; sum[root]=mul[root]=0; return t;} int mid=(l+r)>>1,t=0;; if (L<=mid && sum[ls[root]]) t+=del(ls[root],l,mid,L,R); if (R>mid && sum[rs[root]]) t+=del(rs[root],mid+1,r,L,R); update(root); return t; } int merge(int x,int y,int l,int r){ if (!x) return y; if (!y) return x; if (l==r){sum[x]+=sum[y]; mul[x]+=mul[y]; return x;} int mid=(l+r)>>1; ls[x]=merge(ls[x],ls[y],l,mid); rs[x]=merge(rs[x],rs[y],mid+1,r); update(x); return x; } int kth(int root,int l,int r,int k){ if (l==r) return l; int mid=(l+r)>>1; if (sum[ls[root]]>=k) return kth(ls[root],l,mid,k); else return kth(rs[root],mid+1,r,k-sum[ls[root]]); } int main(){ m=getint(); for (int i=1;i<=m;i++){ a[i][0]=getint(); a[i][1]=getint(); if (a[i][0]==1) b[++xb]=a[i][1]; if (a[i][0]==2) a[i][2]=getint(); if (a[i][0]==3 || a[i][0]==4){a[i][2]=getint(); b[++xb]=a[i][2];} if (a[i][0]==5 || a[i][0]==6) a[i][2]=getint(); } sort(b+1,b+xb+1); for (int i=1;i<=xb;i++) LOG[i]=log(b[i]); for (int i=1;i<=m;i++){ if (a[i][0]==1){ n++; fa[n]=n; x=lower(a[i][1]); add(rt[n],1,xb,x,LOG[x],1); } if (a[i][0]==2){ x=gfa(a[i][1]); y=gfa(a[i][2]); if (x==y) continue; rt[fa[x]=y]=merge(rt[x],rt[y],1,xb); } if (a[i][0]==3){ x=gfa(a[i][1]); y=lower(a[i][2]); cnt=0; cnt=del(rt[x],1,xb,1,y-1); if (cnt) add(rt[x],1,xb,y,LOG[y],cnt); } if (a[i][0]==4){ x=gfa(a[i][1]); y=lower(a[i][2]); cnt=0; cnt=del(rt[x],1,xb,y+1,xb); if (cnt) add(rt[x],1,xb,y,LOG[y],cnt); } if (a[i][0]==5){x=gfa(a[i][1]); y=a[i][2]; printf("%d\n",b[kth(rt[x],1,xb,y)]);} if (a[i][0]==6){x=gfa(a[i][1]); y=gfa(a[i][2]); printf("%d\n",mul[rt[x]]>mul[rt[y]]?1:0);} if (a[i][0]==7){x=gfa(a[i][1]); printf("%d\n",sum[rt[x]]);} } return 0; }
|