so easy(并查集+unordered_map)
There are nn points in an array with index from 11 to nn, and there are two operations to those points.
1: 1 \ x1 x marking the point xx is not available
2: 2 \ x2 x query for the index of the first available point after that point (including xx itself) .
Input
n\quad qnq
z_1 \quad x_1z1x1
\vdots⋮
z_q\quad x_qzqxq
qq is the number of queries, zz is the type of operations, and xx is the index of operations. 1≤x<n<10^91≤x<n<109, 1 \leq q<10^61≤q<106 and zz is 11 or 22
Output
Output the answer for each query.
样例输入
5 3 1 2 2 2 2 1
样例输出
3 1
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 100; unordered_map<int, int> fa; int findfa(int x) { if (!fa.count(x)) return x; return fa[x] = findfa(fa[x]); } int main() { int n, q; scanf("%d %d", &n, &q); int op, x; while (q--) { scanf("%d %d", &op, &x); if (op == 1) { fa[x] = findfa(x + 1); } else { int ans = findfa(x); if (ans > n) ans = -1; printf("%d\n", ans); } } return 0; }