-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy path083-02a.cpp
More file actions
57 lines (57 loc) · 1.26 KB
/
083-02a.cpp
File metadata and controls
57 lines (57 loc) · 1.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int N, M, Q;
cin >> N >> M;
vector<vector<int> > G(N);
for (int i = 0; i < M; ++i) {
int a, b;
cin >> a >> b; --a, --b;
G[a].push_back(b);
G[b].push_back(a);
}
cin >> Q;
vector<int> x(Q), y(Q);
for (int i = 0; i < Q; ++i) {
cin >> x[i] >> y[i]; --x[i];
}
int B = int(sqrt(2 * M));
vector<int> large;
for (int i = 0; i < N; ++i) {
if (G[i].size() >= B) {
large.push_back(i);
}
}
vector<vector<bool> > link(N, vector<bool>(large.size(), false));
for (int i = 0; i < large.size(); ++i) {
for (int j : G[large[i]]) {
link[j][i] = true;
}
link[large[i]][i] = true;
}
vector<int> update(N, -1);
vector<int> update_large(large.size(), -1);
for (int i = 0; i < Q; ++i) {
int last = update[x[i]];
for (int j = 0; j < large.size(); ++j) {
if (link[x[i]][j]) {
last = max(last, update_large[j]);
}
}
cout << (last != -1 ? y[last] : 1) << endl;
if (G[x[i]].size() < B) {
update[x[i]] = i;
for (int j : G[x[i]]) {
update[j] = i;
}
}
else {
int ptr = find(large.begin(), large.end(), x[i]) - large.begin();
update_large[ptr] = i;
}
}
return 0;
}