简单线段树,tle到不行...还没查出来....貌似二分没问题....求救....
#include "cstdio"
#include "cassert"
#include "cstring"
const int N = 50005;
int seg[N<<2], val[N], n, x;
int ques(int l, int r, int L, int R, int rt){
if(l<=L && R<=r) {
return seg[rt];
}
int mid = (L+R)>>1;
int res = 0;
if (l<=mid){
res += ques(l, r, L, mid, rt<<1);
}
if(r>mid){
res += ques(l, r, mid+1, R, rt<<1|1);
}
return res;
}
void inse(int v, int L, int R, int rt){
if (v<=L && R<=v)
{
++seg[rt];
return;
}
int mid = (L+R)>>1;
if(v<=mid){
inse(v, L, mid, rt<<1);
}
else {
inse(v, mid+1, R, rt<<1|1);
}
++seg[rt];
}
int work(int l, int r){
while(l<r){
int mid = (l+r)>>1;
if (mid-ques(1, mid, 1, n, 1)<x) {
l = mid+1;
}
else {
r = mid;
}
}
inse(l, 1, n, 1);
return l;
}
int main()
{
int m, i;
while(~scanf("%d", &n)){
memset(seg, 0, sizeof(seg));
for (i=1; i<=n; ++i){
scanf("%d", &x);
assert(1<=x && x<=n-i+1);
val[i] = work(1, n);
}
scanf("%d", &m);
for (i=1; i<=m; ++i){
scanf("%d", &x);
assert(1<=x && x<=n);
printf("%d%c", val[x], i==m?'\n':' ');
}
}
return 0;
}