#include #define ALL(x) (x).begin(), (x).end() #define LB(v, x) (int)(lower_bound(ALL(v), x) - (v).begin()) #define UQ(v) sort(ALL(v)), (v).erase(unique(ALL(v)), (v).end()) #define IO ios::sync_with_stdio(false), cin.tie(nullptr); #define chmax(a, b) (a) = (a) < (b) ? (b) : (a) #define chmin(a, b) (a) = (a) < (b) ? (a) : (b) using namespace std; using ll = long long; const int INF = 1e9 + 10; const ll INFL = 4e18; int main() { int N; cin >> N; vector A(N), B(N); for (int i = 0; i < N; i++) cin >> A[i] >> B[i]; vector b1; for (int i = 0; i < N; i++) if (B[i] == 1) b1.push_back(i); vector pre(N, -1), nxt(N, -1); for (int i = 0; i < N; i++) { if (A[i] == 1) { nxt[i + 1] = i, pre[i] = i + 1; } else if (B[i] == 2) { int nb = b1[LB(b1, i + 1)]; nxt[nb] = i, pre[i] = nb; } } vector seen(N, false); map> ans; for (int i = 0; i < N; i++) { if (seen[i]) continue; if (pre[i] == -1) { ans[i].push_back({i}); } else { int now = i; while (pre[now] != -1) now = pre[now]; int top = now; vector out; while (true) { out.push_back(now); seen[now] = true; now = nxt[now]; if (now == -1) break; } ans[top] = out; } } for (auto [x, v] : ans) { for (int y : v) cout << y + 1 << '\n'; } }