POJ2828 Buy Tickets
转载自 https://www.cnblogs.com/zhengguiping--9876/p/4717024.html
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5;
struct seg { int l,r,sum; } t[N*4+10];
void build(int p,int l,int r)
{
t[p].l=l;
t[p].r=r;
t[p].sum=r-l+1;
if(l==r) return;
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
void modify(int p,int l)
{
if(t[p].l==t[p].r)
{
t[p].sum--;
return;
}
int mid=(t[p].l+t[p].r)/2;
if(l<=mid) modify(p*2,l);
else modify(p*2+1,l);
t[p].sum=t[p*2].sum+t[p*2+1].sum;
}
int query(int p,int k)
{
if(t[p].l==t[p].r) return t[p].l;
if(t[p*2].sum<k) return query(p*2+1,k-t[p*2].sum);
else return query(p*2,k);
}
int pos[N+10],val[N+10];
int n,a[N+10];
void sol()
{
build(1,1,n);
for(int i=n;i;i--)
{
int zzt=query(1,pos[i]);
a[zzt]=val[i];
modify(1,zzt);
}
for(int i=1;i<=n;i++) printf("%d ",a[i]);
putchar('\n');
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++) scanf("%d%d",&pos[i],&val[i]),pos[i]++;
sol();
}
return 0;
}