1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 200010 #define cl(xx,yy) memset((xx),(yy),sizeof((xx))) #define lson(i) ((i)<<1) #define rson(i) ((i)<<1|1)
struct SegTree{ int l,r,cnt; SegTree(){} SegTree(int _l,int _r){ l = _l; r = _r; cnt = r-l+1; } int mid(){ return (l+r)>>1; } }t[N<<2]; int n,pos[N],name[N],res[N];
void build(int rt,int a,int b){ t[rt] = SegTree(a,b); if(a == b) return ; int mid = t[rt].mid(); build(lson(rt),a,mid); build(rson(rt),mid+1,b); }
int query(int rt,int cnt){ if(t[rt].l == t[rt].r) return t[rt].l; int lcnt = t[lson(rt)].cnt; int rcnt = t[rson(rt)].cnt; if(lcnt >= cnt) return query(lson(rt),cnt); else return query(rson(rt),cnt-lcnt); }
void PushUp(int rt){ t[rt].cnt = t[lson(rt)].cnt + t[rson(rt)].cnt; }
void updata(int rt,int index){ if(t[rt].l == t[rt].r){ t[rt].cnt = 0; return ; } int mid = t[rt].mid(); if(index <= mid) updata(lson(rt),index); else updata(rson(rt),index); PushUp(rt); }
int main(){ while(scanf("%d",&n)!=EOF){ for(int i = 0; i < n; i++){ scanf("%d%d",&pos[i],&name[i]); pos[i]++; } cl(res,-1); build(1,1,n); for(int i = n-1; i >= 0; i--){ int index = query(1,pos[i]); res[index] = name[i]; updata(1,index); } for(int i = 1; i <= n; i++){ printf("%d",res[i]); if(i == n) puts(""); else printf(" "); } } return 0; }
|