/*线段树 区间维护当前可插入的个数*/
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 200000 + 5;
struct node {
int l, r, sum;
};
struct person {
int pos, val;
};
node tree[maxn << 2];
person p[maxn];
int n, id, ans[maxn];
void build(int l, int r, int root)
{
tree[root].l = l;
tree[root].r = r;
tree[root].sum = tree[root].r - tree[root].l + 1;
if (tree[root].l == tree[root].r)
return;
int mid = (tree[root].l + tree[root].r) >> 1;
build(l, mid, root << 1);
build(mid + 1, r, root << 1 | 1);
}
void update(int l, int r, int root, int pos)
{
tree[root].sum--;
if (tree[root].l == tree[root].r) {
id = tree[root].l;
return;
}
int mid = (tree[root].l + tree[root].r) >> 1;
if (tree[root << 1].sum >= pos)
update(l, mid, root << 1, pos);
else {
pos -= tree[root << 1].sum;
update(mid + 1, r, root << 1 | 1, pos);
}
}
int main()
{
while (cin >> n) {
memset(ans, -1, sizeof(ans));
build(1, n, 1);
for (int i = 0; i < n; ++i) {
scanf("%d%d", &p[i].pos, &p[i].val);
}
for (int i = n - 1; i >= 0; --i) {
update(1, n, 1, p[i].pos + 1);
ans[id] = p[i].val;
}
printf("%d", ans[1]);
for (int i = 2; i <= n; ++i)
printf(" %d", ans[i]);
printf("\n");
}
return 0;
}
POJ2828 Buy Tickets
最新推荐文章于 2022-12-18 15:00:41 发布