EntropyIncreaser

HDU 6756

Jul 21st, 2020
1,288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.04 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <cctype>
  7.  
  8. #include <algorithm>
  9. #include <random>
  10. #include <bitset>
  11. #include <queue>
  12. #include <functional>
  13. #include <set>
  14. #include <map>
  15. #include <vector>
  16. #include <chrono>
  17. #include <iostream>
  18. #include <limits>
  19. #include <numeric>
  20.  
  21. #define LOG(FMT...) fprintf(stderr, FMT)
  22.  
  23. using namespace std;
  24.  
  25. typedef long long ll;
  26. typedef unsigned long long ull;
  27.  
  28. // mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  29.  
  30. template <class T>
  31. istream& operator>>(istream& is, vector<T>& v) {
  32.   for (T& x : v)
  33.     is >> x;
  34.   return is;
  35. }
  36.  
  37. template <class T>
  38. ostream& operator<<(ostream& os, const vector<T>& v) {
  39.   if (!v.empty()) {
  40.     os << v.front();
  41.     for (int i = 1; i < v.size(); ++i)
  42.       os << ' ' << v[i];
  43.   }
  44.   return os;
  45. }
  46.  
  47. int main() {
  48. #ifdef ELEGIA
  49.   freopen("test.in", "r", stdin);
  50.   int nol_cl = clock();
  51. #endif
  52.   ios::sync_with_stdio(false);
  53.   cin.tie(nullptr);
  54.  
  55.   int T;
  56.   cin >> T;
  57.   while (T--) {
  58.     int n, m;
  59.     cin >> n >> m;
  60.     vector<vector<int>> g(n);
  61.     set<pair<int, int>> uniq;
  62.     vector<int> A(n);
  63.     cin >> A;
  64.     for (int rep = 0; rep < m; ++rep) {
  65.       int u, v;
  66.       cin >> u >> v;
  67.       --u; --v;
  68.       if (u > v) swap(u, v);
  69.       if (uniq.insert(make_pair(u, v)).second) {
  70.         g[u].push_back(v);
  71.         if (u != v)
  72.           g[v].push_back(u);
  73.       }
  74.     }
  75.     int B = sqrt(m), cnt = 0;
  76.     if (B == 0) ++B;
  77.     vector<int> id(n, -1);
  78.     for (int i = 0; i < n; ++i)
  79.       if (g[i].size() >= B)
  80.         id[i] = cnt++;
  81.     vector<vector<int>> bg(n);
  82.     for (int i = 0; i < n; ++i) {
  83.       for (int j : g[i])
  84.         if (id[j] != -1)
  85.           bg[i].push_back(id[j]);
  86.     }
  87.     vector<vector<int>> vs(cnt, vector<int>(n + 1)), bl(cnt, vector<int>(n / B + 1));
  88.     set<int> al;
  89.     for (int i = 0; i <= n; ++i) al.insert(i);
  90.     auto ins = [&](int u) {
  91.       if (A[u] > n) return;
  92.       for (int j : bg[u])
  93.         if (vs[j][A[u]]++ == 0)
  94.           ++bl[j][A[u] / B];
  95.     };
  96.     auto ers = [&](int u) {
  97.       if (A[u] > n) return;
  98.       for (int j : bg[u])
  99.         if (--vs[j][A[u]] == 0)
  100.           --bl[j][A[u] / B];
  101.     };
  102.     for (int i = 0; i < n; ++i) ins(i);
  103.     auto qry = [&](int u) {
  104.       if (id[u] != -1) {
  105.         int ret = 0;
  106.         while (bl[id[u]][ret / B] == B) ret += B;
  107.         while (vs[id[u]][ret]) ++ret;
  108.         return ret;
  109.       } else {
  110.         vector<bool> vis(g[u].size() + 1);
  111.         for (int j : g[u])
  112.           if (A[j] < vis.size())
  113.             vis[A[j]] = true;
  114.         int ret = 0;
  115.         while (vis[ret]) ++ret;
  116.         return ret;
  117.       }
  118.     };
  119.     int q;
  120.     cin >> q;
  121.     while (q--) {
  122.       int opt, u;
  123.       cin >> opt >> u;
  124.       --u;
  125.       if (opt == 1) {
  126.         ers(u);
  127.         cin >> A[u];
  128.         ins(u);
  129.       } else
  130.         cout << qry(u) << '\n';
  131.     }
  132.   }
  133.  
  134. #ifdef ELEGIA
  135.   LOG("Time: %dms\n", int ((clock()
  136.           -nol_cl) / (double)CLOCKS_PER_SEC * 1000));
  137. #endif
  138.   return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment