传送门biu~
题解:c<=7
#include<bits/stdc++.h>
#define N 400005
#define INF 1000000000
using namespace std;
struct Node{
Node* ch[2];
int siz;
double sum;
Node(){
ch[0]=ch[1]=NULL;
siz=0;
sum=0;
}
void maintain(){
siz=0;sum=0;
if(ch[0]) siz+=ch[0]->siz,sum+=ch[0]->sum;
if(ch[1]) siz+=ch[1]->siz,sum+=ch[1]->sum;
}
}*root[N];
void Insert(Node* &o,int pos,int v,int L,int R){
if(!o) o=new Node();
if(L==R){
o->siz+=v;
o->sum=o->siz*log(L);
return;
}
int mid=L+R>>1;
if(pos<=mid) Insert(o->ch[0],pos,v,L,mid);
else Insert(o->ch[1],pos,v,mid+1,R);
o->maintain();
}
void Merge(Node* &x,Node* &y){
if(!y) return;
if(!x){
x=y;
return;
}
x->siz+=y->siz;
x->sum+=y->sum;
Merge(x->ch[0],y->ch[0]);
Merge(x->ch[1],y->ch[1]);
}
void Clear(Node* &o,int l,int r,int L,int R){
if(!o) return;
if(l>r) return;
if(l==L && r==R){
delete(o);
o=NULL;
return;
}
int mid=L+R>>1;
if(r<=mid) Clear(o->ch[0],l,r,L,mid);
else if(l>mid) Clear(o->ch[1],l,r,mid+1,R);
else Clear(o->ch[0],l,mid,L,mid),Clear(o->ch[1],mid+1,r,mid+1,R);
o->maintain();
}
int Query_siz(Node* o,int l,int r,int L,int R){
if(l>r || !o) return 0;
if(l==L && r==R) return o->siz;
int mid=L+R>>1;
if(r<=mid) return Query_siz(o->ch[0],l,r,L,mid);
else if(l>mid) return Query_siz(o->ch[1],l,r,mid+1,R);
else return Query_siz(o->ch[0],l,mid,L,mid)+Query_siz(o->ch[1],mid+1,r,mid+1,R);
}
int Query_Kth(Node* o,int x,int L,int R){
if(L==R) return L;
if(!o || o->siz<x) return -1;
int mid=L+R>>1;
int Lsiz=o->ch[0] ? o->ch[0]->siz : 0;
if(Lsiz>=x) return Query_Kth(o->ch[0],x,L,mid);
else return Query_Kth(o->ch[1],x-Lsiz,mid+1,R);
}
int n,father[400005];
int search(int x){return father[x]==x?x:father[x]=search(father[x]);}
int main(){
int m;
scanf("%d",&m);
while(m--){
int opt;
scanf("%d",&opt);
switch(opt){
case 1:{
int x;
scanf("%d",&x);
Insert(root[++n],x,1,1,INF);
father[n]=n;
break;
}
case 2:{
int x,y;
scanf("%d%d",&x,&y);
x=search(x); y=search(y);
if(x==y) continue;
father[y]=x;
Merge(root[x],root[y]);
break;
}
case 3:{
int a,x;
scanf("%d%d",&a,&x);
a=search(a);
int p=Query_siz(root[a],1,x-1,1,INF);
Insert(root[a],x,p,1,INF);
Clear(root[a],1,x-1,1,INF);
break;
}
case 4:{
int a,x;
scanf("%d%d",&a,&x);
a=search(a);
int p=Query_siz(root[a],x+1,INF,1,INF);
Insert(root[a],x,p,1,INF);
Clear(root[a],x+1,INF,1,INF);
break;
}
case 5:{
int a,k;
scanf("%d%d",&a,&k);
a=search(a);
printf("%d\n",Query_Kth(root[a],k,1,INF));
break;
}
case 6:{
int x,y;
scanf("%d%d",&x,&y);
x=search(x);y=search(y);
printf("%d\n",root[x]->sum>root[y]->sum);
break;
}
case 7:{
int x;
scanf("%d",&x);
x=search(x);
printf("%d\n",root[x]->siz);
break;
}
}
}
return 0;
}