fork download
  1. #include <bits/stdc++.h>
  2.  
  3. #define int long long
  4.  
  5. #define debug cout << "ok\n";
  6. #define SQR(x) (1LL * ((x) * (x)))
  7. #define MASK(i) (1LL << (i))
  8. #define BIT(x, i) (((x) >> (i)) & 1)
  9. #define fi first
  10. #define se second
  11. #define pb push_back
  12.  
  13. #define mp make_pair
  14. #define pii pair<int,int>
  15. #define pli pair<ll,int>
  16. #define vi vector<int>
  17.  
  18. #define FAST ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  19.  
  20. typedef long long ll;
  21. typedef unsigned long long ull;
  22. typedef long double ld;
  23. typedef unsigned int ui;
  24.  
  25. using namespace std;
  26.  
  27. const int M = 1e9 + 7;
  28. const int INF = 1e9 + 7;
  29. const ll INFLL = (ll)2e18 + 7LL;
  30. const ld PI = acos(-1);
  31.  
  32. const int dx[] = {1, -1, 0, 0, -1, 1, 1, -1};
  33. const int dy[] = {0, 0, 1, -1, -1, -1, 1, 1};
  34.  
  35. template<class _, class __>
  36. bool minimize(_ &x, const __ y){
  37. if(x > y){
  38. x = y;
  39. return true;
  40. } else return false;
  41. }
  42. template<class _, class __>
  43. bool maximize(_ &x, const __ y){
  44. if(x < y){
  45. x = y;
  46. return true;
  47. } else return false;
  48. }
  49.  
  50. template<class _,class __>
  51. void Add(_ &x, const __ y) {
  52. x += y;
  53. if (x >= M) {
  54. x -= M;
  55. }
  56. return;
  57. }
  58.  
  59. template<class _,class __>
  60. void Diff(_ &x, const __ y) {
  61. x -= y;
  62. if (x < 0) {
  63. x += M;
  64. }
  65. return;
  66. }
  67.  
  68. //--------------------------------------------------------------
  69.  
  70. const int MaxN = 1e5+7;
  71.  
  72. int n,m,q,res[MaxN];
  73. set<int> s[MaxN];
  74.  
  75. struct Edges {
  76. int u;
  77. int v;
  78. int w;
  79. } edge[MaxN];
  80.  
  81. bool cmp(Edges a,Edges b) {
  82. return a.w < b.w;
  83. }
  84.  
  85. struct Query {
  86. int u;
  87. int v;
  88. int k;
  89. int cs;
  90. } que[MaxN],que_tmp[MaxN];
  91.  
  92. struct DSU {
  93. stack<pii> st1;
  94. stack<pii> st2;
  95.  
  96. int n;
  97. vi lab;
  98.  
  99. void Set(int _n) {
  100. n = _n;
  101. lab.resize(n+1,-1);
  102. }
  103.  
  104. int GR(int u) {
  105. return lab[u] < 0 ? u : GR(lab[u]);
  106. }
  107.  
  108. pii history() {
  109. return mp(st1.size(),st2.size());
  110. }
  111.  
  112. void uni(int u,int v) {
  113. u = GR(u);
  114. v = GR(v);
  115. if (u == v) return;
  116. st1.push(mp(u,lab[u]));
  117. st1.push(mp(v,lab[v]));
  118. if (lab[u] < lab[v]) {
  119. lab[u] += lab[v];
  120. lab[v] = u;
  121. for (int x : s[v]) {
  122. if (s[u].find(x) == s[u].end()) {
  123. s[u].insert(x);
  124. st2.push(mp(u,x));
  125. }
  126. }
  127. }
  128. else {
  129. lab[v] += lab[u];
  130. lab[u] = v;
  131. for (int x : s[u]) {
  132. if (s[v].find(x) == s[v].end()) {
  133. s[v].insert(x);
  134. st2.push(mp(v,x));
  135. }
  136. }
  137. }
  138. }
  139.  
  140. void rollback(pii tmp) {
  141. while (st1.size() > tmp.fi) {
  142. int u = st1.top().fi;
  143. int v = st1.top().se;
  144. lab[u] = v;
  145. st1.pop();
  146. }
  147. while (st2.size() > tmp.se) {
  148. int u = st2.top().fi;
  149. int v = st2.top().se;
  150. s[u].erase(v);
  151. st2.pop();
  152. }
  153. }
  154. } dsu;
  155.  
  156. void dnc(int l,int r,int ls,int rs) {
  157. if (l > r || ls > rs) return;
  158. int mid = (l+r) >> 1;
  159. pii tmp = dsu.history();
  160. for (int i=l;i<=mid;i++) {
  161. dsu.uni(edge[i].u,edge[i].v);
  162. }
  163. int lss = ls - 1;
  164. int rss = rs + 1;
  165. for (int i=ls;i<=rs;i++) {
  166. int u = que[i].u;
  167. int v = que[i].v;
  168. int k = que[i].k;
  169. int cs = que[i].cs;
  170. u = dsu.GR(u);
  171. v = dsu.GR(v);
  172. if (u != v || s[u].size() < k) {
  173. que_tmp[--rss] = que[i];
  174. }
  175. else {
  176. minimize(res[cs],edge[mid].w);
  177. que_tmp[++lss] = que[i];
  178. }
  179. }
  180. for (int i=ls;i<=rs;i++) que[i] = que_tmp[i];
  181. dnc(mid+1,r,rss,rs);
  182. dsu.rollback(tmp);
  183. dnc(l,mid-1,ls,lss);
  184. }
  185.  
  186. void sol() {
  187. cin >> n >> m >> q;
  188. dsu.Set(n);
  189. for (int i=1;i<=n;i++) {
  190. int x;
  191. cin >> x;
  192. s[i].insert(x);
  193. }
  194. for (int i=1;i<=m;i++) {
  195. int u,v,k;
  196. cin >> u >> v >> k;
  197. edge[i] = (Edges){u,v,k};
  198. }
  199. sort(edge+1,edge+m+1,cmp);
  200. // for (int i=1;i<=m;i++) cout << edge[i].u << ' ' << edge[i].v << ' ' << edge[i].w << '\n';
  201. memset(res,0x3f,sizeof(res));
  202. for (int i=1;i<=q;i++) {
  203. int u,v,k;
  204. cin >> u >> v >> k;
  205. if (u == v && k == 1) res[i] = 0;
  206. que[i] = (Query){u,v,k,i};
  207. }
  208. dnc(1,m,1,q);
  209. for (int i=1;i<=q;i++) cout << res[i] << '\n';
  210. }
  211.  
  212. signed main() {
  213. freopen("test.inp","r",stdin);
  214. // freopen("TRAVEL.inp","r",stdin);
  215. // freopen("TRAVEL.out","w",stdout);
  216. FAST
  217. int t=1;
  218. // cin >> t;
  219. while (t--) sol();
  220. }
  221.  
Success #stdin #stdout 0.01s 10560KB
stdin
Standard input is empty
stdout
Standard output is empty