染色

 

 

 1 #include <iostream>
 2 #include <algorithm>
 3 
 4 using namespace std;
 5 
 6 const int maxn = 1000003;
 7 
 8 int n, m, father[maxn], op[maxn], ans[maxn], size[maxn];
 9 
10 int findRoot(int x) {
11     int p, q;
12     for (p = x; p != father[p]; p = father[p]);
13     for (; x != p; q = father[x], father[x] = p, x = q);
14     return p;
15 }
16 
17 void init(int n) {
18     for (int i = 1; i <= n; ++ i) {
19         father[i] = i - 1;
20         size[i] = 1;
21     }
22 }
23 
24 int main() {
25     cin >> n >> m;
26     init(n);
27     for (int i = 0; i < m; ++ i) {
28         int opt, v;
29         cin >> opt >> v;
30         if (opt == 1) { // 插入
31             father[v] = v;
32             op[i] = -v;
33         } else { // 查询
34             op[i] = v;
35         }
36     }
37     for (int i = m - 1; i >= 0; -- i) {
38         if (op[i] < 0) { // 插入,现在要删除它
39             father[-op[i]] = -op[i] - 1;
40         } else { // 查询前趋
41             ans[i] = findRoot(op[i] - 1);
42         }
43     }
44     for (int i = 0; i < m; ++ i) {
45         if (ans[i]) {
46             cout << ans[i] << endl;
47         }
48     }
49 }

 

posted @ 2017-01-23 13:49  InWILL  阅读(127)  评论(0)    收藏  举报