Advertisement
Galebickosikasa

Untitled

Aug 27th, 2020
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.39 KB | None | 0 0
  1. // #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
  2. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx")
  3. // #pragma comment(linker, "/stack:200000000"]
  4.  
  5. #include <iostream>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <unordered_set>
  10. #include <unordered_map>
  11. #include <set>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <bitset>
  16. #include <stack>
  17. #include <random>
  18. #include <fstream>
  19. #include <sstream>
  20. #include <chrono>
  21.  
  22. #define fi first
  23. #define se second
  24. #define pb push_back
  25. #define ll long long
  26. #define ld long double
  27. #define hm unordered_map
  28. #define pii pair<int, int>
  29. #define sz(a) (int)a.size()
  30. #define all(a) a.begin(), a.end()
  31. #define cinv(v) for (auto& x: v) cin >> x
  32. #define fr(i, n) for (int i = 0; i < n; ++i)
  33. #define fl(i, l, n) for (int i = l; i < n; ++i)
  34.  
  35. // #define int ll
  36.  
  37. using namespace std;
  38.  
  39. #ifdef __LOCAL
  40. #define dbg(x) cerr << #x << " : " << x << '\n'
  41. const int maxn = 2e5 + 20;
  42. #else
  43. #define dbg(x)
  44. const int maxn = 2e5 + 20;
  45. #endif
  46.  
  47. //tg: @galebickosikasa
  48.  
  49. ostream& operator << (ostream& out, vector<int>& v) {
  50. for (auto& x: v) out << x << ' ';
  51. return out;
  52. }
  53.  
  54. ostream& operator << (ostream& out, pii& v) {
  55. out << v.fi << ", " << v.se;
  56. return out;
  57. }
  58.  
  59. ostream& operator << (ostream& out, vector<pii>& v) {
  60. for (auto& x: v) out << x << '\n';
  61. return out;
  62. }
  63.  
  64. istream& operator >> (istream& in, pii& a) {
  65. in >> a.fi >> a.se;
  66. return in;
  67. }
  68.  
  69. const ll inf = (ll) 2e9;
  70. const ll kek = 2e18;
  71. const ld pi = asin (1) * 2;
  72. const ld eps = 1e-8;
  73. const ll mod = (ll)1e9 + 7;
  74. const ll ns = 97;
  75. const int maxs = 1e6 + 20;
  76.  
  77. mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
  78.  
  79. multiset<int> answers;
  80. int parent[maxn], sz[maxn], colors[maxn], pr[maxn], pos[maxn], order[maxn];
  81. ll dist[maxn];
  82. vector<pii> g[maxn];
  83. int j = 0;
  84.  
  85. void dfs (int v, int p = -1) {
  86. parent[v] = p;
  87. order[j++] = v;
  88. // dbg (v);
  89. // dbg (dist[v]);
  90. sz[v] = 1;
  91. for (auto& u: g[v]) {
  92. int to = u.fi, c = u.se;
  93. if (to == p) continue;
  94. dist[to] = dist[v] + (ll)c;
  95. dfs (to, v);
  96. sz[v] += sz[to];
  97. }
  98. }
  99.  
  100. struct DSU {
  101. vector<int> dsu;
  102.  
  103. DSU (int s = maxn) {
  104. dsu = vector<int> (s);
  105. fr (i, s) dsu[i] = i;
  106. }
  107.  
  108. int get (int x) {
  109. if (dsu[x] == x) return x;
  110. return dsu[x] = get (dsu[x]);
  111. }
  112.  
  113. bool join (int a, int b) {
  114. int x = get (a), y = get (b);
  115. if (x != y) {
  116. dsu[x] = y;
  117. return 1;
  118. }
  119. return 0;
  120. }
  121. };
  122.  
  123. struct edge {
  124. int a, b, c;
  125.  
  126. bool operator < (const edge& other) const {
  127. return c < other.c;
  128. }
  129. };
  130.  
  131. vector<edge> edges;
  132.  
  133. struct Tree {
  134. Tree* left;
  135. Tree* right;
  136. int priority, color, mx, mn;
  137. ll value;
  138.  
  139. Tree (ll d, int x) {
  140. left = right = nullptr;
  141. priority = rnd ();
  142. value = d;
  143. color = mx = mn = x;
  144. }
  145. };
  146.  
  147. int get_mn (Tree* t) {
  148. if (t == nullptr) return inf;
  149. return t->mn;
  150. }
  151.  
  152. int get_mx (Tree* t) {
  153. if (t == nullptr) return -inf;
  154. return t->mx;
  155. }
  156.  
  157. ll get_val (Tree* t) {
  158. if (t == nullptr) return -1;
  159. return t->value;
  160. }
  161.  
  162. void render (Tree* t) {
  163. if (t == nullptr) return;
  164. t->mx = max (t->color, max (get_mx (t->left), get_mx (t->right)));
  165. t->mn = min (t->color, min (get_mn (t->left), get_mn (t->right)));
  166. }
  167.  
  168. Tree* merge (Tree* l, Tree* r) {
  169. if (l == nullptr) return r;
  170. if (r == nullptr) return l;
  171. if (l->priority > r->priority) {
  172. l->right = merge (l->right, r);
  173. render (l);
  174. return l;
  175. } else {
  176. r->left = merge (l, r->left);
  177. render (r);
  178. return r;
  179. }
  180. }
  181.  
  182. pair<Tree*, Tree*> split (Tree* t, ll x) {
  183. pair<Tree*, Tree*> ptt = {nullptr, nullptr};
  184. if (t == nullptr) return ptt;
  185. if (t->value > x) {
  186. ptt = split (t->left, x);
  187. t->left = ptt.se;
  188. ptt.se = t;
  189. } else {
  190. ptt = split (t->right, x);
  191. t->right = ptt.fi;
  192. ptt.fi = t;
  193. }
  194. render (t);
  195. return ptt;
  196. }
  197.  
  198. Tree* erase (Tree* t, ll d, int x) {
  199. if (t == nullptr) return t;
  200. if (t->value == d && t->color == x) return merge (t->left, t->right);
  201. if (t->value > d) t->left = erase (t->left, d, x);
  202. else t->right = erase (t->right, d, x);
  203. render (t);
  204. return t;
  205. }
  206.  
  207. Tree* add (Tree* t, Tree* a) {
  208. auto ptt = split (t, a->value);
  209. ptt.fi = merge (ptt.fi, a);
  210. return merge (ptt.fi, ptt.se);
  211. }
  212.  
  213. Tree* add (Tree* t, ll d, int x) {
  214. Tree* a = new Tree (d, x);
  215. return add (t, a);
  216. }
  217.  
  218. // void dfs (Tree* t) {
  219. // if (t == nullptr) return;
  220. // dfs (t->left);
  221. // dbg (t->value);
  222. // dbg (t->color);
  223. // dfs (t->right);
  224. // }
  225.  
  226. ll down (Tree* t, int new_color) {
  227. if (t == nullptr || (t->mn == new_color && t->mx == new_color)) return kek;
  228. ll ans = kek;
  229. // dbg (t->value);
  230. // dfs (t);
  231. // dbg ("exit");
  232. // dbg (get_val (t->left));
  233. // dbg (get_val (t->right));
  234. if (t->color != new_color) ans = t->value;
  235. if (get_mn (t->left) == inf || (get_mn (t->left) == new_color && get_mx (t->left) == new_color)) {
  236. ans = min (ans, down (t->right, new_color));
  237. // dbg ("right");
  238. // dbg (ans);
  239. return ans;
  240. }
  241. ans = min (ans, down (t->left, new_color));
  242. // dbg ("left");
  243. // dbg (ans);
  244. return ans;
  245. }
  246.  
  247. struct ST {
  248. vector<Tree*> t;
  249. int size = 0, capacity;
  250.  
  251. ST (int s = maxn) {
  252. while ((1<<size) < s) ++size;
  253. ++size;
  254. size = (1<<size);
  255. capacity = (size>>1);
  256. t = vector<Tree*> (size, nullptr);
  257. vector<vector<pii>> tmp (size);
  258. fr (i, j) {
  259. tmp[i + capacity].pb ({dist[order[i]], colors[order[i]]});
  260. t[i + capacity] = add (t[i + capacity], dist[order[i]], colors[order[i]]);
  261. }
  262. for (int i = capacity - 1; i > 0; --i) {
  263. for (auto& x: tmp[i * 2]) tmp[i].pb (x);
  264. for (auto& x: tmp[i * 2 + 1]) tmp[i].pb (x);
  265. // dbg (i);
  266. // dbg (tmp[i]);
  267. for (auto& x: tmp[i]) t[i] = add (t[i], x.fi, x.se);
  268. }
  269. }
  270.  
  271. ll upd (int cur, int left, int right, int l, int r, int new_color) {
  272. if (cur >= size) return kek;
  273. if (left > r || right < l) return kek;
  274. if (l <= left && r >= right) {
  275. // dbg ("open");
  276. // dbg (cur);
  277. return down (t[cur], new_color);
  278. }
  279. return min (upd (cur * 2, left, (left + right) / 2, l, r, new_color), upd (cur * 2 + 1, (left + right) / 2 + 1, right, l, r, new_color));
  280. }
  281.  
  282. ll upd (int l, int r, int new_color) {
  283. return upd (1, 0, capacity - 1, l, r, new_color);
  284. }
  285.  
  286. void upd (int v, int new_color) {
  287. if (v < 0) {
  288. v *= -1;
  289. ll x = upd (pos[v] + 1, pos[v] + sz[v] - 1, new_color) - dist[v];
  290. int p = pr[v];
  291. if (p < inf) {
  292. auto it = answers.find (p);
  293. if (it != answers.end ()) answers.erase (it);
  294. }
  295. if (x + dist[v] < inf) answers.insert (x), pr[v] = x;
  296. return;
  297. }
  298.  
  299. if (sz[v] <= 1) {
  300. int u = pos[v] + capacity;
  301. // dbg (u);
  302. int p = colors[v];
  303. while (u) {
  304. // dbg ("here");
  305. // dfs (t[u]);
  306. t[u] = erase (t[u], dist[v], p);
  307. // dbg (dist[v]);
  308. // dbg (p);
  309. // dbg ("cont");
  310. // dfs (t[u]);
  311. t[u] = add (t[u], dist[v], new_color);
  312. // dbg ("end");
  313. // dfs (t[u]);
  314. u /= 2;
  315. }
  316. return;
  317. }
  318. int u = pos[v] + capacity;
  319. // dbg (u);
  320. int p = colors[v];
  321. while (u) {
  322. // dbg ("here");
  323. // dfs (t[u]);
  324. t[u] = erase (t[u], dist[v], p);
  325. // dbg (dist[v]);
  326. // dbg (p);
  327. // dbg ("cont");
  328. // dfs (t[u]);
  329. t[u] = add (t[u], dist[v], new_color);
  330. // dbg ("end");
  331. // dfs (t[u]);
  332. u /= 2;
  333. }
  334. ll x = upd (pos[v] + 1, pos[v] + sz[v] - 1, new_color) - dist[v];
  335. // dbg (v);
  336. // dbg (x);
  337. p = pr[v];
  338. // dbg (p);
  339. if (p < inf) {
  340. auto it = answers.find (p);
  341. if (it != answers.end ()) answers.erase (it);
  342. }
  343. if (x + dist[v] < inf) answers.insert (x), pr[v] = x;
  344. }
  345. };
  346.  
  347.  
  348.  
  349. signed main () {
  350. ios_base::sync_with_stdio(false);
  351. cin.tie(nullptr);
  352. cout.tie(nullptr);
  353. int n, m, d, q;
  354. cin >> n >> m >> d >> q;
  355. fr (i, m) {
  356. int a, b, c;
  357. cin >> a >> b >> c;
  358. edges.pb ({a, b, c});
  359. }
  360. sort (all (edges));
  361. DSU dsu (n + 1);
  362. for (auto& e: edges) {
  363. if (dsu.join (e.a, e.b)) {
  364. g[e.a].pb ({e.b, e.c}), g[e.b].pb ({e.a, e.c});
  365. }
  366. }
  367. dfs (1);
  368. // fr (i, n) dbg (dist[i + 1]);
  369. // dbg (order);
  370. fr (i, j) {
  371. pos[order[i]] = i;
  372. }
  373. fr (i, n) {
  374. int x;
  375. cin >> x;
  376. colors[i + 1] = x;
  377. }
  378. for (auto& x: pr) x = inf;
  379. ST goo (n + 1);
  380. fr (i, n) goo.upd (i + 1, colors[i + 1]);
  381. // for (auto& x: answers) dbg (x);
  382. // dbg ("BEGIN");
  383. fr (i, q) {
  384. int v, x;
  385. cin >> v >> x;
  386. goo.upd (v, x);
  387. colors[v] = x;
  388. if (parent[v] != -1) goo.upd (-parent[v], colors[parent[v]]);
  389. cout << *answers.begin () << '\n';
  390. // dbg ("NEXT");
  391. }
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement