#include <bits/stdc++.h>
using namespace std;
const int N = 1E5 + 7, MOD = 1000000;
int size[N], cnt[N], key[N], ch[N][2], f[N];
int res, sz, rt;
void clear(int x) {cnt[x]=size[x]=key[x]=ch[x][0]=ch[x][1]=f[x]=0;}
int get(int x) {return x==ch[f[x]][1];}
void pushup(int x)
{
if(x) {
size[x] = cnt[x];
if(ch[x][0]) size[x] += size[ch[x][0]];
if(ch[x][1]) size[x] += size[ch[x][1]];
}
}
void rotate(int x, int &k)
{
int y = f[x], z = f[y], l = get(x), r = !l;
if(y == k) {
k = x;
} else {
ch[z][get(y)] = x;
}
f[x] = z, f[y] = x, f[ch[x][r]] = y;
ch[y][l] = ch[x][r], ch[x][r] = y;
pushup(y); pushup(x);
}
void splay(int x, int &k) //旋转到指定位置
{
while(x != k) {
int y = f[x];
if(y != k) rotate( (get(x) == get(y)) ? y : x, k);
rotate(x, k);
}
}
void insert(int v)
{
if(rt == 0) {
sz ++, ch[sz][0] = ch[sz][1] = f[sz] = 0;
key[sz] = v, cnt[sz] = size[sz] = 1;
rt = sz;
return ;
}
int now = rt, fa = 0;
while(true) {
if(key[now] == v) {
cnt[now] ++, pushup(now), pushup(fa); splay(now, rt); break;
}
fa = now;
now = ch[now][v > key[now]];
if(now == 0) {
sz ++;
ch[sz][0] = ch[sz][1] = 0; key[sz] = v, cnt[sz] = size[sz] = 1;
f[sz] = fa; ch[fa][v > key[fa]] = sz;
pushup(fa);
splay(sz, rt);
break;
}
}
}
int find(int v) //找到V的排名
{
int ans = 0, now = rt;
while(true) {
if(v < key[now]) {
now = ch[now][0];
} else {
ans += (ch[now][0] ? size[ch[now][0]] : 0);
if(v == key[now]) {
splay(now, rt); return ans + 1;
}
ans += cnt[now];
now = ch[now][1];
}
}
}
int pre()
{
int now = ch[rt][0];
while(ch[now][1]) now = ch[now][1];
return now;
}
int nxt()
{
int now = ch[rt][1];
while(ch[now][0]) now = ch[now][0];
return now;
}
int findx(int x) //找到排名为X的数
{
int now = rt;
while(true) {
if(ch[now][0] && size[ch[now][0]] >= x) {
now = ch[now][0];
} else {
int tmp = (ch[now][0] ? size[ch[now][0]]:0) + cnt[now];
if(x <= tmp) return key[now];
x -= tmp;
now = ch[now][1];
}
}
}
void del(int x)
{
find(x);
if(cnt[rt] > 1) {
cnt[rt] --; return ;
}
if(!ch[rt][0] && !ch[rt][1]) {
clear(rt);
rt = 0; return ;
}
if(!ch[rt][0]) {
int oldrt = rt; rt = ch[rt][1]; f[rt] = 0; clear(oldrt); return ;
} else if(!ch[rt][1]) {
int oldrt = rt; rt = ch[rt][0]; f[rt] = 0; clear(oldrt); return ;
}
int leftBig = pre(), oldrt = rt;
splay(leftBig, rt);
f[ch[oldrt][1]] = rt;
ch[rt][1] = ch[oldrt][1];
clear(oldrt);
pushup(rt);
return ;
}
void del(int &x, int fa, int limit) //删除有限制的数
{
if(!x) return ;
if(key[x] >= limit) {
del(ch[x][0], x, limit);
} else {
res += size[ch[x][0]] + cnt[x];
x = ch[x][1];
f[x] = fa;
if(f == 0) rt = x;
del(x, fa, limit);
}
if(x) pushup(x);
}
int main()
{
}