fork download
  1. // ~~ icebear love attttttt ~~
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7. typedef pair<int, ii> iii;
  8.  
  9. template<class T>
  10. bool minimize(T &a, const T &b) {
  11. if (a > b) return a = b, true;
  12. return false;
  13. }
  14.  
  15. template<class T>
  16. bool maximize(T &a, const T &b) {
  17. if (a < b) return a = b, true;
  18. return false;
  19. }
  20.  
  21. #define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
  22. #define FORR(i,a,b) for(int i=(a); i>=(b); --i)
  23. #define REP(i, n) for(int i=0; i<(n); ++i)
  24. #define RED(i, n) for(int i=(n)-1; i>=0; --i)
  25. #define MASK(i) (1LL << (i))
  26. #define BIT(S, i) (((S) >> (i)) & 1)
  27. #define mp make_pair
  28. #define pb push_back
  29. #define fi first
  30. #define se second
  31. #define all(x) x.begin(), x.end()
  32. #define task "friends"
  33.  
  34. const int MOD = 1e9 + 7;
  35. const int inf = 1e9 + 27092008;
  36. const ll INF = 1e18 + 27092008;
  37. const int N = 2e5 + 5;
  38. const int THRESHOLD = 555;
  39. int n, m, q;
  40. bitset<N> heavyFriends[444];
  41. vector<int> G[N], heavys;
  42. int deg[N], id[N], rankDeg = -1;
  43. array<int, 3> query[N];
  44. map<ii, bool> heavyConnect;
  45. bool isHeavy[N];
  46. int cur[N];
  47.  
  48. void init(void) {
  49. cin >> n >> m;
  50. while(m--) {
  51. int u, v;
  52. cin >> u >> v;
  53. G[u].pb(v);
  54. G[v].pb(u);
  55. deg[u]++; deg[v]++;
  56. }
  57. cin >> q;
  58. FOR(i, 1, q) {
  59. cin >> query[i][0] >> query[i][1] >> query[i][2];
  60. if (query[i][0] == 1) deg[query[i][1]]++, deg[query[i][2]]++;
  61. }
  62. FOR(i, 1, n) isHeavy[i] = (deg[i] >= THRESHOLD);
  63. FOR(i, 1, n)
  64. if (isHeavy[i]) {
  65. heavys.pb(i);
  66. id[i] = ++rankDeg;
  67. for(int v : G[i]) heavyFriends[id[i]].set(v);
  68. heavyFriends[id[i]].set(i);
  69. }
  70. }
  71.  
  72. void process(void) {
  73. int u, v;
  74. FOR(i, 1, q) {
  75. u = query[i][1];
  76. v = query[i][2];
  77. if (query[i][0] == 1) {
  78. if (isHeavy[u]) heavyFriends[id[u]].set(v);
  79. if (isHeavy[v]) heavyFriends[id[v]].set(u);
  80. if (!isHeavy[u]) {
  81. if (isHeavy[v]) {
  82. for(int z : G[u]) if (isHeavy[z])
  83. heavyConnect[{z, v}] = heavyConnect[{v, z}] = true;
  84. }
  85. G[u].pb(v);
  86. }
  87. if (!isHeavy[v]) {
  88. if (isHeavy[u]) {
  89. for(int z : G[u]) if (isHeavy[z])
  90. heavyConnect[{z, u}] = heavyConnect[{u, z}] = true;
  91. }
  92. G[v].pb(u);
  93. }
  94. } else {
  95. if (isHeavy[u] && isHeavy[v]) {
  96. // pass light node
  97. if (heavyConnect.find({u, v}) != heavyConnect.end()) cout << "YES\n";
  98. else {
  99. // pass heavy node
  100. for(int x : heavys) if (heavyFriends[id[u]].test(x) && heavyFriends[id[v]].test(x)) {
  101. cout << "YES\n";
  102. exit(0);
  103. }
  104. cout << "NO\n";
  105. }
  106. } else {
  107. bool ans = false;
  108. if (isHeavy[v]) swap(u, v);
  109. if (isHeavy[u]) {
  110. if ((heavyFriends[id[u]].test(v))) ans = true;
  111. for(int z : G[v])
  112. if (heavyFriends[id[u]].test(z)) {
  113. ans = true;
  114. break;
  115. }
  116. } else {
  117. cur[u] = cur[v] = i;
  118. for(int z : G[u]) cur[z] = i;
  119. for(int z : G[v]) if (cur[z] == i) ans = true;
  120. }
  121. cout << (ans ? "YES\n" : "NO\n");
  122. }
  123. }
  124. }
  125. }
  126.  
  127. int main() {
  128. ios_base::sync_with_stdio(0);
  129. cin.tie(0); cout.tie(0);
  130. if (fopen(task".inp", "r")) {
  131. freopen(task".inp", "r", stdin);
  132. freopen(task".out", "w", stdout);
  133. }
  134. int tc = 1;
  135. // cin >> tc;
  136. while(tc--) {
  137. init();
  138. process();
  139. }
  140. return 0;
  141. }
  142.  
Success #stdin #stdout 0.01s 11708KB
stdin
Standard input is empty
stdout
Standard output is empty