题目:http://acm.fzu.edu.cn/problem.php?pid=1962
线段树存人数来解题
#include<iostream>
#include<cstdio>
using namespace std;
int a[2000001];
void update(int rt) {
a[rt]=a[rt<<1]+a[rt<<1|1];
}
void build(int l,int r,int rt)
{
if(l==r) a[rt]=1;
else{
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
update(rt);
}
}
void leave(int l,int r,int k,int rt)
{
if(l==r) a[rt]=0;
else{
if(k<=a[rt<<1]) leave(l,(l+r)/2,k,rt<<1);
else leave((l+r)/2+1,r,k-a[rt<<1],rt<<1|1);
update(rt);
}
}
void Return(int l,int r,int x,int boot)
{
if(l==r) a[boot]=1;
else{
if(x<=(l+r)/2) Return(l,(l+r)/2,x,boot<<1);
else Return ((l+r)/2+1,r,x,boot<<1|1);
update(boot);
}
}
int qurry(int l,int r,int k,int boot)
{
if(l==r) return l;
if(a[boot<<1]>=k) return qurry(l,(l+r)/2,k,boot<<1);
else return qurry((l+r)/2+1,r,k-a[boot<<1],boot<<1|1);
}
int main()
{
char c;
int n,m,t;
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--){
getchar();
scanf("%c%d",&c,&t);
if(c=='L') leave(1,n,t,1);
else if(c=='R') Return (1,n,t,1);
else if(c=='Q') printf("%d\n",qurry(1,n,t,1));
}
return 0;
}