updown

Untitled

Jul 15th, 2024
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. #include "bits/stdc++.h"
  2. #define MAXN 100005
  3.  
  4. using namespace std;
  5.  
  6. pair<pair<int,int>, int> tri(int a, int b, int c) {
  7. int arr[] = {a, b, c};
  8. sort(arr, arr+3);
  9. return {{arr[0], arr[1]}, arr[2]};
  10. }
  11.  
  12. int n, m, t, u;
  13. set<int> adj[MAXN];
  14. map<pair<int, int>, set<pair<pair<int, int>, int>>> mp;
  15. int triangles = 0;
  16.  
  17. void add_e(int x, int y) {
  18. adj[x].insert(y);
  19. adj[y].insert(x);
  20.  
  21. for (int j : adj[x]) {
  22. if (j == y) continue;
  23. if (adj[y].find(j) != adj[y].end()) {
  24. if (mp[{x, y}].size() == 0 && mp[{min(x, j), max(x, j)}].size() == 0 && mp[{min(y, j), max(y, j)}].size() == 0)
  25. triangles++;
  26. auto t = tri(x, y, j);
  27. mp[{min(x, j), max(x, j)}].insert(t);
  28. mp[{min(y, j), max(y, j)}].insert(t);
  29. mp[{x, y}].insert(t);
  30. }
  31. }
  32. }
  33.  
  34. int find3rd(int x, int y, pair<pair<int,int>, int> p) {
  35. if (p.first.first != x && p.first.first != y)
  36. return p.first.first;
  37. if (p.first.second != x && p.first.second != y)
  38. return p.first.second;
  39. return p.second;
  40. }
  41.  
  42. void rem_e(int x, int y) {
  43. adj[x].erase(y);
  44. adj[y].erase(x);
  45.  
  46. if (mp[{x, y}].size() == 1) {
  47. auto p = *mp[{x, y}].begin();
  48. int z = find3rd(x, y, p);
  49. if (mp[{min(x, z), max(x, z)}].size() == 1 && mp[{min(y, z), max(y, z)}].size() == 1)
  50. triangles--;
  51. } else {
  52. auto p1 = *mp[{x, y}].begin(), p2 = *((mp[{x, y}].begin())++);
  53. int z1 = find3rd(x, y, p1), z2 = find3rd(x, y, p2);
  54.  
  55. if (adj[z1].find(z2) == adj[z1].end()) {
  56. triangles--;
  57. }
  58. }
  59.  
  60. for (auto p : mp[{x, y}]) {
  61. int z = find3rd(x, y, p);
  62. mp[{min(x, z), max(x, z)}].erase(p);
  63. mp[{min(y, z), max(y, z)}].erase(p);
  64. }
  65. mp[{x, y}] = set<pair<pair<int,int>, int>>();
  66. }
  67.  
  68. int main() {
  69. ios_base::sync_with_stdio(0);
  70. cin.tie(0);
  71. cin >> n >> m >> t;
  72. for (int i = 0; i < m; i++) {
  73. int a, b; cin >> a >> b;
  74. add_e(min(a, b), max(a, b));
  75. }
  76.  
  77. cin >> u;
  78.  
  79. for (int i = 0; i < u; i++) {
  80. int a, b; cin >> a >> b;
  81. int x = min(a, b), y = max(a, b);
  82. if (adj[x].find(y) != adj[x].end())
  83. rem_e(x, y);
  84. else
  85. add_e(x, y);
  86. if (t == 1)
  87. cout << n - 3 * triangles << "\n";
  88. else
  89. cout << (3*triangles == n ? "YES" : "NO") << "\n";
  90. }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment