题意:买票排队时,会有人插队的,给出每个人在进行排队时,有人多少人在他前面且这个人的权是多少。求最后队列中从前到后每一个人的权是多少。
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l ,m , rt << 1
#define rson m+1 , r , rt << 1 | 1
const int maxn = 222222;
int pos[maxn<<2];
int K[maxn][2];
int ans[maxn];
int id;
void build(int l,int r,int rt)
{
pos[rt] = r - l +1;
if(l == r)
return;
int m = (l + r) >> 1;
build(lson);
build(rson);
}
void update(int p,int l,int r,int rt)
{
pos[rt] --;
if(l == r)
{
id=l;
return;
}
int m = (l + r) >> 1;
if(p <= pos[rt << 1])
{
update(p,lson);
}
else
{
p -= pos[rt << 1];
update(p,rson);
}
}
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
build(1 , n, 1);
for(i = 1;i <= n; i ++)
scanf("%d%d",&K[i][0],&K[i][1]);
for(i = n;i >= 1; i --)
{
update(K[i][0]+1 , 1 , n ,1);
ans[id] = K[i][1];
}
for(i = 1;i <= n;i ++)
printf("%d%c",ans[i],i==n?'\n':' ');
}
return 0;
}