Advertisement
ivnikkk

Untitled

Dec 16th, 2021
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. #include <vector>
  2. #include<iostream>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <iomanip>
  6. #include <fstream>
  7. #include <string>
  8. #include <set>
  9. #include <deque>
  10. #include <queue>
  11. #include <map>
  12. #include <bitset>
  13. #include <random>
  14. #include <cassert>
  15. #include <unordered_map>
  16. #include <unordered_set>
  17. using namespace std;
  18. typedef long long             ll;
  19. typedef unsigned long long     ull;
  20. typedef long double            ld;
  21. #define endl              "\n"
  22. #define all(a)            a.begin(), a.end()
  23. #define allr(a)           a.rbegin(), a.rend()
  24. #define pb                push_back
  25. #define F                 first
  26. #define S             second
  27. const ll inf = 1e18;
  28. struct big_v{
  29.     ll num;
  30.     unordered_map <ll, ll> version;
  31. };
  32. signed main() {
  33.     ios_base::sync_with_stdio(false);
  34.     cin.tie(nullptr);
  35.     ll t = 1;
  36.     //cin >> t;
  37.     while (t--) {
  38.         ll n, m;
  39.         cin >> n >> m;
  40.         vector<vector<ll>>gr(n);
  41.         vector<ll>v(n);
  42.         for (ll i = 0; i < n; i++) {
  43.             cin >> v[i];
  44.         }
  45.         for (ll i = 0; i < m; i++) {
  46.             ll u, v;
  47.             cin >> u >> v;
  48.             u--, v--;
  49.             gr[u].push_back(v);
  50.             gr[v].push_back(u);
  51.         }
  52.         ll c = 660;
  53.         /*
  54.         auto cmp = [&](ll lht, ll rht) {
  55.             return gr[lht].size() < gr[rht].size();
  56.         };
  57.         for (ll i = 0; i < n; i++) {
  58.             sort(all(gr[i]), cmp);
  59.         }
  60.         auto cmp2 = [&](vector<ll> lht, vector<ll> rht) {
  61.             return lht.size() < rht.size();
  62.         };
  63.         sort(all(gr), cmp2);
  64.         */
  65.         vector<big_v> vertex(n);
  66.         vector<bool>  big_vert(n, false);
  67.         vector<vector<ll>>gr_sqrt(n);
  68.         for (ll i = 0; i < n; i++) {
  69.             if (gr[i].size() >= c) {
  70.                 big_vert[i] = true;
  71.                 big_v in;
  72.                 in.num = i;
  73.                 unordered_map<ll, ll> sub;
  74.                 in.version = sub;
  75.                 vertex[i] = in;
  76.                 for (ll& j : gr[i]) {
  77.                     if (gr[j].size() >= c) {
  78.                         gr_sqrt[i].push_back(j);
  79.                     }
  80.                 }
  81.             }
  82.         }
  83.         ll ans = 0;
  84.         for (ll i = 0; i < n; i++) {
  85.             for (ll& j : gr[i]) {
  86.                 ans += v[i] == v[j];
  87.             }
  88.         }
  89.         ans /= 2;
  90.         for (ll i = 0; i < n; i++) {
  91.             if (big_vert[i]) {
  92.                 ll cur_v = vertex[i].num;
  93.                 for (ll j = 0; j < gr[cur_v].size(); j++) {
  94.                         vertex[i].version[v[gr[cur_v][j]]]++;
  95.                 }
  96.             }
  97.         }
  98.         ll q;
  99.         cin >> q;
  100.         for (ll i = 0; i < q; i++) {
  101.             ll vert, swop;
  102.             cin >> vert >> swop;
  103.             vert--;
  104.             ll last_color = v[vert];
  105.             v[vert] = swop;
  106.             if (big_vert[vert]) {
  107.                 ans -= vertex[vert].version[last_color];
  108.                 ans += vertex[vert].version[swop];
  109.                 for (ll& to : gr_sqrt[vert]) {
  110.                     vertex[to].version[last_color]--;
  111.                     vertex[to].version[swop]++;
  112.                 }
  113.             }
  114.             else {
  115.                 for (ll& to : gr[vert]) {
  116.                     if (v[to] == last_color) {
  117.                         ans--;
  118.                     }
  119.                     if (v[to] == swop) {
  120.                         ans++;
  121.                     }
  122.                     if (gr[to].size() >= c) {
  123.                         vertex[to].version[last_color]--;
  124.                         vertex[to].version[swop]++;
  125.                     }
  126.                 }
  127.             }
  128.             cout << m-ans << endl;
  129.         }
  130.     }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement