链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3635
题意:每个人有张票,上面的数字代表他坐在从左往右第几个空座上。。
思路:线段树记录空座数目,水线段树。。
#include <cstdio>
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 55555;
int sum[maxn<<2];
int ans[maxn];
void PushUP(int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void build(int l,int r,int rt) {
if (l == r) {
sum[rt] = 1;
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUP(rt);
}
void update(int p,int add,int l,int r,int rt,int now) {
if (l == r) {
sum[rt] += add;
ans[now] = l;
return ;
}
int m = (l + r) >> 1;
if (sum[rt<<1]>=p) update(p , add , lson,now);
else update(p-sum[rt<<1] , add , rson,now);
PushUP(rt);
}
int main() {
int n;
while(~scanf("%d",&n)){
build(1,n,1);
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
update(a,-1,1,n,1,i);
}
int m;
scanf("%d",&m);
while(m--){
int a;
scanf("%d",&a);
printf("%d",ans[a]);
if(m)printf(" ");
else printf("\n");
}
}
return 0;
}