Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2022
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.08 KB | None | 0 0
  1. #pragma GCC optimize("O3")
  2. #pragma GCC target ("avx2")
  3. #pragma GCC optimize("Ofast")
  4. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  5. #pragma GCC optimize("unroll-loops")
  6.  
  7. #include<bits/stdc++.h>
  8.  
  9. #define sz(v) (int)v.size()
  10. #define ll long long
  11. #define pb push_back
  12. #define x first
  13. #define y second
  14. #define all(v) v.begin(), v.end()
  15. #define rall(v) v.rbegin(), v.rend()
  16. #define nl "\n"
  17.  
  18. using namespace std;
  19. using pii = pair<int, int>;
  20.  
  21. const int N = (int)5e4 + 7; // make sure this is right
  22. const int M = (int)25e4 + 7;
  23. const int K = (int)450;
  24. const int inf = (int)1e9 + 7;
  25. const ll INF = (ll)3e18 + 7;
  26. const ll MOD = (ll)1e9 + 7; // make sure this is right
  27.  
  28. pii dir[] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
  29.  
  30. int n, m, q, o, cnt[N], id[N];
  31. char t[M];
  32. int u[M], v[M];
  33. unordered_set<int> S[N];
  34. bitset<2 * K + 5> have[2 * K + 5];
  35.  
  36. bool online[N], used[N];
  37.  
  38. void solve() {
  39.     cin >> n >> m >> q >> o;
  40.     while(o--) {
  41.         int x;
  42.         cin >> x;
  43.         online[x] = 1;
  44.     }
  45.     for(int i = 0; i < m; ++i) {
  46.         int x, y;
  47.         cin >> x >> y;
  48.         S[x].insert(y);
  49.         S[y].insert(x);
  50.     }      
  51.     for(int i = 0; i < q; ++i) {
  52.         cin >> t[i];
  53.         if(t[i] == 'O') {
  54.             cin >> u[i];
  55.         } else if(t[i] == 'F') {
  56.             cin >> u[i];
  57.         } else if(t[i] == 'A') {
  58.             cin >> u[i] >> v[i];
  59.         } else if(t[i] == 'D') {
  60.             cin >> u[i] >> v[i];
  61.         } else {
  62.             cin >> u[i];
  63.         }
  64.     }
  65.     bitset<2 * K + 5> on;
  66.     int sz;    
  67.     for(int I = 0; I < q; I += K) {
  68.         on.reset();
  69.         for(int i = 1; i <= n; ++i) {
  70.             cnt[i] = id[i] = 0;
  71.             used[i] = 0;
  72.         }          
  73.         sz = 0;            
  74.         for(int i = I; i < min(q, I + K); ++i) {
  75.             used[u[i]] = 1;
  76.             if(t[i] == 'D' || t[i] == 'A') {
  77.                 used[v[i]] = 1;
  78.             }
  79.         }  
  80.         for(int i = 1; i <= n; ++i) {
  81.             if(used[i]) {
  82.                 ++sz;
  83.                 id[i] = sz;
  84.                 on[sz] = online[i];
  85.             }
  86.         }
  87.         for(int i = 1; i <= sz; ++i) {
  88.             have[i].reset();
  89.         }
  90.         for(int i = 1; i <= n; ++i) {
  91.             for(auto x : S[i]) {
  92.                 if(!used[x]) {
  93.                     if(online[x]) cnt[i]++;
  94.                 } else {
  95.                     if(used[i]) {
  96.                         have[id[i]][id[x]] = have[id[x]][id[i]] = 1;
  97.                     }
  98.                 }
  99.             }
  100.         }
  101.         for(int i = I; i < min(q, I + K); ++i) {
  102.             if(t[i] == 'O') {
  103.                 online[u[i]] = 1;
  104.                 on[id[u[i]]] = 1;
  105.             } else if(t[i] == 'F') {
  106.                 online[u[i]] = 0;
  107.                 on[id[u[i]]] = 0;
  108.             } else if(t[i] == 'A') {
  109.                 S[u[i]].insert(v[i]);
  110.                 S[v[i]].insert(u[i]);
  111.  
  112.                 have[id[u[i]]][id[v[i]]] = have[id[v[i]]][id[u[i]]] = 1;
  113.             } else if(t[i] == 'D') {
  114.                 S[u[i]].erase(v[i]);
  115.                 S[v[i]].erase(u[i]);
  116.  
  117.                 have[id[u[i]]][id[v[i]]] = have[id[v[i]]][id[u[i]]] = 0;
  118.             } else {
  119.                 int ans = cnt[u[i]];
  120.                 /*
  121.                 for(int j = 1; j <= sz; ++j) {
  122.                     if(online[s[j]] && have[id[u[i]]][j]) ans++;
  123.                 }
  124.                 */
  125.                 ans += (on & have[id[u[i]]]).count();
  126.                 cout << ans << nl;
  127.             }      
  128.         }
  129.     }
  130. }
  131.  
  132. signed main() {
  133.     ios_base::sync_with_stdio(0);
  134.     cin.tie(0);
  135.  
  136.     int test = 1;
  137.     //cin >> test;
  138.     for(int i = 1; i <= test; ++i) {
  139.         //cout << "Case " << i << ":\n";
  140.         solve();
  141.     }
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement