fork download
  1. /*
  2. * @Author: hungeazy
  3. * @Date: 2025-10-22 11:14:47
  4. * @Last Modified by: hungeazy
  5. * @Last Modified time: 2025-10-23 14:24:21
  6. */
  7. #include <bits/stdc++.h>
  8. #include <ext/pb_ds/assoc_container.hpp>
  9. #include <ext/pb_ds/tree_policy.hpp>
  10. // #pragma GCC optimize("O3")
  11. // #pragma GCC optimize("unroll-loops")
  12. // #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
  13. using namespace std;
  14. using namespace __gnu_pbds;
  15. bool M1;
  16. #define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
  17. #define int long long
  18. #define ll long long
  19. #define ull unsigned long long
  20. #define sz(x) x.size()
  21. #define sqr(x) (1LL * (x) * (x))
  22. #define all(x) x.begin(), x.end()
  23. #define fill(f,x) memset(f,x,sizeof(f))
  24. #define FOR(i,l,r) for(int i=l;i<=r;i++)
  25. #define FOD(i,r,l) for(int i=r;i>=l;i--)
  26. #define debug(x) cout << #x << " = " << x << '\n'
  27. #define ii pair<int,int>
  28. #define iii pair<int,ii>
  29. #define di pair<ii,ii>
  30. #define vi vector<int>
  31. #define vii vector<ii>
  32. #define mii map<int,int>
  33. #define fi first
  34. #define se second
  35. #define pb push_back
  36. #define MOD 1000000007
  37. #define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
  38. #define YES cout << "YES\n"
  39. #define NO cout << "NO\n"
  40. #define MASK(i) (1LL << (i))
  41. #define c_bit(i) __builtin_popcountll(i)
  42. #define BIT(x,i) ((x) & MASK(i))
  43. #define SET_ON(x,i) ((x) | MASK(i))
  44. #define SET_OFF(x,i) ((x) & ~MASK(i))
  45. #define oo 1e18
  46. #define name ""
  47. #define endl '\n'
  48. #define memory() cerr << abs(&M2-&M1)/1024.0/1024 << " MB" << endl
  49. #define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms." << endl
  50. template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
  51. template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
  52. template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
  53. const int N = (int)2e5+10;
  54. int n,m,q;
  55. array<int,3> edge[N];
  56.  
  57. struct Query {
  58. int l,r;
  59. } query[N];
  60.  
  61. namespace sub2 {
  62.  
  63. bool approved() {
  64. return n <= 2e3 and m <= 2e3 and q <= 2e3;
  65. }
  66.  
  67. struct DSU {
  68. int par[N],sz[N];
  69.  
  70. void init() {
  71. FOR(i,1,n+1)
  72. {
  73. par[i] = i;
  74. sz[i] = 1;
  75. }
  76. }
  77.  
  78. int acs(int u) {
  79. return (par[u] == u ? u : par[u] = acs(par[u]));
  80. }
  81.  
  82. bool join(int u, int v)
  83. {
  84. int x = acs(u), y = acs(v);
  85. if (x != y)
  86. {
  87. if (sz[x] < sz[y]) swap(x,y);
  88. sz[x] += sz[y];
  89. par[y] = x;
  90. return true;
  91. }
  92. return false;
  93. }
  94. } dsu;
  95.  
  96. void solve(void)
  97. {
  98. sort(edge+1,edge+m+1,[&](array<int,3> &x, array<int,3> &y) {
  99. return x[2] < y[2];
  100. });
  101. FOR(j,1,q)
  102. {
  103. int l = query[j].l, r = query[j].r;
  104. l++; r++;
  105. dsu.init();
  106. FOR(i,l,r) dsu.join(i,n+1);
  107. int ans = 0;
  108. FOR(i,1,m)
  109. {
  110. auto [u,v,w] = edge[i];
  111. if (dsu.join(u,v)) ans += w;
  112. }
  113. cout << ans << endl;
  114. }
  115. }
  116.  
  117. }
  118.  
  119. namespace sub7 {
  120.  
  121. vector<array<int,3>> upd[N];
  122. int ans[N],lastUpdate[N];
  123. vii Q[N];
  124.  
  125. struct SegmentTree {
  126. vi st,lazy;
  127. int n;
  128.  
  129. SegmentTree() {};
  130. SegmentTree(int _n):
  131. n(_n), st((_n<<2)+1,0), lazy((_n<<2)+1,0) {};
  132.  
  133. void down(int id, int l, int r)
  134. {
  135. if (!lazy[id]) return;
  136. int &k = lazy[id], mid = (l+r)>>1;
  137. st[id<<1] += k*(mid-l+1);
  138. st[id<<1|1] += k*(r-mid);
  139. for (int i : {id<<1,id<<1|1})
  140. lazy[i] += k;
  141. k = 0;
  142. }
  143.  
  144. void update(int id, int l, int r, int u, int v, int val)
  145. {
  146. if (l > v or r < u) return;
  147. if (l >= u and r <= v)
  148. {
  149. st[id] += val*(r-l+1);
  150. lazy[id] += val;
  151. return;
  152. }
  153. int mid = (l+r)>>1; down(id,l,r);
  154. update(id<<1,l,mid,u,v,val);
  155. update(id<<1|1,mid+1,r,u,v,val);
  156. st[id] = st[id<<1]+st[id<<1|1];
  157. }
  158.  
  159. int get(int id, int l, int r, int u, int v)
  160. {
  161. if (l > v or r < u) return 0;
  162. if (l >= u and r <= v) return st[id];
  163. int mid = (l+r)>>1; down(id,l,r);
  164. return get(id<<1,l,mid,u,v)+get(id<<1|1,mid+1,r,u,v);
  165. }
  166. } IT;
  167.  
  168. struct DSU {
  169. int par[N],sz[N];
  170. set<int> nodes[N];
  171.  
  172. void init() {
  173. FOR(i,0,n-1)
  174. {
  175. par[i] = i;
  176. sz[i] = 1;
  177. nodes[i].insert(i);
  178. }
  179. }
  180.  
  181. int acs(int u) {
  182. return (u == par[u] ? u : par[u] = acs(par[u]));
  183. }
  184.  
  185. bool join(int i)
  186. {
  187. auto [u,v,w] = edge[i];
  188. u--; v--;
  189. int x = acs(u), y = acs(v);
  190. if (x != y)
  191. {
  192. if (sz[x] < sz[y]) swap(x,y);
  193. sz[x] += sz[y];
  194. par[y] = x;
  195. for (int v : nodes[y])
  196. {
  197. auto it = nodes[x].lower_bound(v);
  198. if (it != nodes[x].end())
  199. upd[v].pb({*it,-w,i});
  200. if (it != nodes[x].begin())
  201. {
  202. it--;
  203. upd[*it].pb({v,-w,i});
  204. }
  205. }
  206. for (int v : nodes[y]) nodes[x].insert(v);
  207. return true;
  208. }
  209. return false;
  210. }
  211. } dsu;
  212.  
  213. void solve(void)
  214. {
  215. FOR(i,1,q) Q[query[i].l].pb({query[i].r,i});
  216. dsu.init();
  217. sort(edge+1,edge+m+1,[&](array<int,3> &x, array<int,3> &y) {
  218. return x[2] < y[2];
  219. });
  220. FOR(i,1,m)
  221. if (dsu.join(i))
  222. ans[0] += edge[i][2];
  223. FOR(i,1,m) lastUpdate[i] = n;
  224. IT = SegmentTree(n);
  225. FOD(i,n-1,0)
  226. {
  227. for (auto x : upd[i])
  228. if (x[0] < lastUpdate[x[2]])
  229. {
  230. IT.update(1,0,n-1,x[0],lastUpdate[x[2]]-1,x[1]);
  231. lastUpdate[x[2]] = x[1];
  232. }
  233. for (auto x : Q[i])
  234. ans[x.se] = IT.get(1,0,n-1,x.fi,x.fi);
  235. }
  236. FOR(i,1,q) cout << ans[i]+ans[0] << endl;
  237. }
  238.  
  239. }
  240.  
  241. bool M2;
  242. signed main()
  243. {
  244. fast;
  245. if (fopen(name".inp","r"))
  246. {
  247. freopen(name".inp","r",stdin);
  248. freopen(name".out","w",stdout);
  249. }
  250. cin >> n >> m >> q;
  251. FOR(i,1,m)
  252. {
  253. int u,v,w;
  254. cin >> u >> v >> w;
  255. u++; v++;
  256. edge[i] = {u,v,w};
  257. }
  258. FOR(i,1,q) cin >> query[i].l >> query[i].r;
  259. // if (sub2::approved()) return sub2::solve(), time(), memory(), 0;
  260. sub7::solve();
  261. time();
  262. memory();
  263. return 0;
  264. }
  265. // ██░ ██ █ ██ ███▄ █ ▄████
  266. //▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
  267. //▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
  268. //░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
  269. //░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
  270. // ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
  271. // ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
  272. // ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
  273. // ░ ░ ░ ░ ░ ░
Success #stdin #stdout #stderr 0.01s 26180KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
-------------Time:8.852ms.
35.0971 MB