正解:权值线段树辣鸡树状数组
倒序处理就清晰明了了。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#define gc getchar()
using namespace std;
const int N=2e5+5;
inline void qr(int &x)
{
    x=0;char c=gc;int f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
void qw(int x)
{
    if(x<0)putchar('-'),x=-x;
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
struct node{int sum;}t[N<<2];
void build(int p,int l,int r)
{
    if(l==r){t[p].sum=1;return ;}
    int mid=l+r>>1;build(p<<1,l,mid),build(p<<1|1,mid+1,r);
    t[p].sum=t[p<<1|1].sum+t[p<<1].sum;
}
int query(int p,int l,int r,int k)
{
    --t[p].sum;
    if(l==r)return l;
    int mid=l+r>>1,sum=t[p<<1].sum;
    if(sum>=k)return query(p<<1,l,mid,k);
    else return query(p<<1|1,mid+1,r,k-sum);
}
int ans[N],q[N],a[N];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        build(1,1,n);
        for(int i=1;i<=n;i++)qr(q[i]),qr(a[i]);
        for(int i=n;i>=1;i--)
        {
            int pos=query(1,1,n,q[i]+1);
            ans[pos]=a[i];
        }
        for(int i=1;i<=n;i++)qw(ans[i]),putchar(' ');
        puts("");
    }
    return 0;
}