Advertisement
aayyk

Untitled

Dec 20th, 2020
934
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.96 KB | None | 0 0
  1. //#pragma GCC optimize("Ofast,unroll-loops")
  2.  
  3. #ifdef LOCAL
  4. #include "debug.h"
  5. #else
  6. #include <bits/stdc++.h>
  7. #include <ext/pb_ds/assoc_container.hpp>
  8. #include <ext/pb_ds/tree_policy.hpp>
  9. #define debug(x...)
  10. #endif
  11.  
  12. using namespace std;
  13.  
  14. //#define int ll
  15.  
  16. typedef long long ll;
  17. typedef long double ld;
  18. typedef pair <int, int> pii;
  19. #define sz(x) int((x).size())
  20.  
  21. template <typename T>
  22. using ordered_set = __gnu_pbds::tree <T, __gnu_pbds::null_type, less<T>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update>;
  23.  
  24. #ifdef ONLINE_JUDGE
  25. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  26. #else
  27. mt19937 rng(1000 - 7);
  28. #endif
  29.  
  30. const int N = 2e5 + 10;
  31. //const ll MOD = 998244353;
  32. const ll MOD = 1e9 + 7;
  33. const ld eps = 5e-8;
  34. const pii dir[] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
  35.  
  36. int n, m, q;
  37. int a[N], id[N];
  38. vector <int> g[N];
  39.  
  40. struct Tree {
  41.     struct Node {
  42.         Node *l = nullptr;
  43.         Node *r = nullptr;
  44.         int tl, tr, sum = 0;
  45.  
  46.         Node(int tl, int tr) : tl(tl), tr(tr) {}
  47.  
  48.         ~Node() {
  49.             delete l;
  50.             delete r;
  51.         }
  52.     };
  53.  
  54.     Node *root = nullptr;
  55.  
  56.     Tree() {}
  57.     Tree(int n) {
  58.         root = new Node(0, n - 1);
  59.     }
  60.  
  61.     void update(Node *u, int pos, int val) {
  62.         if (u->tl == u->tr) {
  63.             u->sum = val;
  64.         }
  65.         else {
  66.             int tm = (u->tl + u->tr) / 2;
  67.  
  68.             if (pos <= tm) {
  69.                 if (!u->l) u->l = new Node(u->tl, tm);
  70.                 update(u->l, pos, val);
  71.             }
  72.             else {
  73.                 if (!u->r) u->r = new Node(tm + 1, u->tr);
  74.                 update(u->r, pos, val);
  75.             }
  76.             u->sum = ((u->l ? u->l->sum : 0) + (u->r ? u->r->sum : 0));
  77.  
  78.             if (u->sum == 0) {
  79.                 delete u;
  80.             }
  81.         }
  82.     }
  83.  
  84.     int get(Node *u) {
  85.         if (u->tl == u->tr) {
  86.             return (u->sum ? -1 : u->tl);
  87.         }
  88.         else {
  89.             if (!u->r) {
  90.                 return u->tr;
  91.             }
  92.             if (u->r->sum < u->r->tr - u->r->tl + 1) {
  93.                 return get(u->r);
  94.             }
  95.             else if (u->l) {
  96.                 return get(u->l);
  97.             }
  98.             else {
  99.                 return (u->tl + u->tr) / 2;
  100.             }
  101.         }
  102.     }
  103. };
  104.  
  105. int best[N];
  106. Tree tree[N];
  107.  
  108. vector <pii> aa;
  109.  
  110. inline int f(int i) {
  111.     if (best[i] == -1) {
  112.         return 0;
  113.     }
  114.  
  115.     int j = aa[best[i]].second;
  116.     if (i != aa.back().second && j != aa.back().second) {
  117.         return a[i] + a[j] + aa.back().first;
  118.     }
  119.     else if (i != aa[n - 2].second && j != aa[n - 2].second) {
  120.         return a[i] + a[j] + aa[n - 2].first;
  121.     }
  122.     else {
  123.         return a[i] + a[j] + aa[n - 3].first;
  124.     }
  125. }
  126.  
  127. struct TreeMin {
  128.     int t[4 * N];
  129.  
  130.     void build(int v, int l, int r) {
  131.         if (l == r) {
  132.             t[v] = f(l);
  133.         }
  134.         else {
  135.             int m = (l + r) / 2;
  136.  
  137.             build(2 * v, l, m);
  138.             build(2 * v + 1, m + 1, r);
  139.  
  140.             t[v] = max(t[2 * v], t[2 * v + 1]);
  141.         }
  142.     }
  143.  
  144.     void update(int v, int l, int r, int pos) {
  145.         if (l == r) {
  146.             t[v] = f(l);
  147.         }
  148.         else {
  149.             int m = (l + r) / 2;
  150.  
  151.             if (pos <= m) {
  152.                 update(2 * v, l, m, pos);
  153.             }
  154.             else {
  155.                 update(2 * v + 1, m + 1, r, pos);
  156.             }
  157.  
  158.             t[v] = max(t[2 * v], t[2 * v + 1]);
  159.         }
  160.     }
  161.  
  162.     int get() {
  163.         return t[1];
  164.     }
  165. } treemin;
  166.  
  167. signed main() {
  168. #ifdef LOCAL
  169.     freopen("input.txt", "r", stdin);
  170.     freopen("output.txt", "w", stdout);
  171. #endif
  172.     cout << fixed << setprecision(9);
  173.     ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  174.  
  175.     cin >> n >> m >> q;
  176.     for (int i = 0; i < n; i++) {
  177.         cin >> a[i];
  178.     }
  179.  
  180.     for (int i = 0, u, v; i < m; i++) {
  181.         cin >> u >> v;
  182.         u--, v--;
  183.         g[u].push_back(v);
  184.         g[v].push_back(u);
  185.     }
  186.  
  187.     aa.resize(n);
  188.     for (int i = 0; i < n; i++) {
  189.         aa[i] = { a[i], i };
  190.     }
  191.     sort(aa.begin(), aa.end());
  192.  
  193.     for (int i = 0; i < n; i++) {
  194.         id[aa[i].second] = i;
  195.     }
  196.  
  197.     for (int i = 0; i < n; i++) {
  198.         tree[i] = Tree(n);
  199.         tree[i].update(tree[i].root, id[i], 1);
  200.  
  201.         for (int j : g[i]) {
  202.             tree[i].update(tree[i].root, id[j], 1);
  203.         }
  204.         best[i] = tree[i].get(tree[i].root);
  205.     }
  206.  
  207.     treemin.build(1, 0, n - 1);
  208.  
  209.     while (q--) {
  210.         int type, u, v;
  211.         cin >> type >> u >> v;
  212.         type = 1 ^ (type - 1);
  213.         u--, v--;
  214.  
  215.         tree[u].update(tree[u].root, id[v], type);
  216.         tree[v].update(tree[v].root, id[u], type);
  217.  
  218.         best[u] = tree[u].get(tree[u].root);
  219.         best[v] = tree[v].get(tree[v].root);
  220.  
  221.         treemin.update(1, 0, n - 1, u);
  222.         treemin.update(1, 0, n - 1, v);
  223.  
  224.         cout << treemin.get() << "\n";
  225.     }
  226.  
  227.     return 0;
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement