
#include <cstring>
#include <cstdio>
#include <vector>

using namespace std;

int loc[1000000], ans[1000000], size[1000000], queue[1000000];
vector<int> son[1000000], unknown[1000000];
pair<int, int> stack[1000000];

int main() {
	int n, root;
	scanf("%d", &n);
	for (int i = 0; i < n; i ++) loc[i] = ans[i] = -1;
	for (int i = 0; i < n; i ++) {
		int a, b;
		scanf("%d%d", &a, &b);
		a --;
		b --;
		if (a == i) {
			root = i;
			continue;
		}
		son[a].push_back(i);
		if (b >= 0) {
			ans[i] = b;
			loc[b] = i;
		} else {
			unknown[a].push_back(i);
		}
	}
	ans[root] = n - 1;
	loc[n-1] = root;
	
	queue[0] = root;
	for (int head = 0, tail = 1; head < tail; head ++)
		for (int i = 0; i < son[queue[head]].size(); i ++)
			queue[tail ++] = son[queue[head]][i];
	for (int i = n - 1; i >= 0; i --) {
		size[queue[i]] = 1;
		for (int j = 0; j < son[queue[i]].size(); j ++)
			size[queue[i]] += size[son[queue[i]][j]];
	}
	
	int top = 0;
	for (int i = 0; i < n; i ++) {
		if (loc[i] == -1) {
			int x = (top > 0) ? stack[top - 1].second : 0;
			stack[top ++] = make_pair(i, x);
			continue;
		}
		int sum = 0;
		for (int j = 0; j < unknown[loc[i]].size(); j ++)
			sum += size[unknown[loc[i]][j]];
		int now = top - 1;
		for (int j = sum; j > 0; j --)
			stack[now --].second += j;
		now = loc[i];
		while (unknown[now].size() == 1) {
			int x = unknown[now][0];
			if (top == 1 || stack[top - 2].second == top - 1) {
				ans[x] = stack[-- top].first;
				now = x;
			} else {
				break;
			}
		}
	}
	
	for (int i = 0; i < n; i ++)
		printf("%d\n", ans[i] + 1);
	
	return 0;
}
