Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- #define MAXN 100005
- using namespace std;
- pair<pair<int,int>, int> tri(int a, int b, int c) {
- int arr[] = {a, b, c};
- sort(arr, arr+3);
- return {{arr[0], arr[1]}, arr[2]};
- }
- int n, m, t, u;
- set<int> adj[MAXN];
- map<pair<int, int>, set<pair<pair<int, int>, int>>> mp;
- int triangles = 0;
- void add_e(int x, int y) {
- adj[x].insert(y);
- adj[y].insert(x);
- for (int j : adj[x]) {
- if (j == y) continue;
- if (adj[y].find(j) != adj[y].end()) {
- if (mp[{x, y}].size() == 0 && mp[{min(x, j), max(x, j)}].size() == 0 && mp[{min(y, j), max(y, j)}].size() == 0)
- triangles++;
- auto t = tri(x, y, j);
- mp[{min(x, j), max(x, j)}].insert(t);
- mp[{min(y, j), max(y, j)}].insert(t);
- mp[{x, y}].insert(t);
- }
- }
- }
- int find3rd(int x, int y, pair<pair<int,int>, int> p) {
- if (p.first.first != x && p.first.first != y)
- return p.first.first;
- if (p.first.second != x && p.first.second != y)
- return p.first.second;
- return p.second;
- }
- void rem_e(int x, int y) {
- adj[x].erase(y);
- adj[y].erase(x);
- if (mp[{x, y}].size() == 1) {
- auto p = *mp[{x, y}].begin();
- int z = find3rd(x, y, p);
- if (mp[{min(x, z), max(x, z)}].size() == 1 && mp[{min(y, z), max(y, z)}].size() == 1)
- triangles--;
- } else {
- auto p1 = *mp[{x, y}].begin(), p2 = *((mp[{x, y}].begin())++);
- int z1 = find3rd(x, y, p1), z2 = find3rd(x, y, p2);
- if (adj[z1].find(z2) == adj[z1].end()) {
- triangles--;
- }
- }
- for (auto p : mp[{x, y}]) {
- int z = find3rd(x, y, p);
- mp[{min(x, z), max(x, z)}].erase(p);
- mp[{min(y, z), max(y, z)}].erase(p);
- }
- mp[{x, y}] = set<pair<pair<int,int>, int>>();
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cin >> n >> m >> t;
- for (int i = 0; i < m; i++) {
- int a, b; cin >> a >> b;
- add_e(min(a, b), max(a, b));
- }
- cin >> u;
- for (int i = 0; i < u; i++) {
- int a, b; cin >> a >> b;
- int x = min(a, b), y = max(a, b);
- if (adj[x].find(y) != adj[x].end())
- rem_e(x, y);
- else
- add_e(x, y);
- if (t == 1)
- cout << n - 3 * triangles << "\n";
- else
- cout << (3*triangles == n ? "YES" : "NO") << "\n";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment