#include //#define RANDOMTEST_DEBUG #include //小数点出力用 //cout << fixed << setprecision(10) << ans; #include #include #include #include #include #include #include #include #include using ll = long long; using namespace std; #define modPHash 1909826258152820093LL #define modP (ll)998244353 bool chkrng0idx(ll pos, ll sup) { return (0 <= pos && pos < sup); } ll clk4(ll num) { return (num - 2) * (num % 2); } void yn(bool tf) { cout << (tf ? "Yes\n" : "No\n"); } using namespace std; #define MAX_V 200002 int Parent[MAX_V]; set SS[MAX_V]; void init(vector &A) { for (int i = 0;i < A.size();i++) { Parent[i] = -1; SS[i].clear(); SS[i].insert(A[i]); } } int find(int x) { if (Parent[x] == -1) { return x; } else { Parent[x] = find(Parent[x]); return Parent[x]; } } void unite(int x, int y) { int a = find(x); int b = find(y); if (a != b) { if (SS[a].size() < SS[b].size()) { for (auto itr = SS[a].begin();itr != SS[a].end(); itr++) { SS[b].insert(*itr); } Parent[a] = b; } else { for (auto itr = SS[b].begin();itr != SS[b].end(); itr++) { SS[a].insert(*itr); } Parent[b] = a; } } } void solve() { int N, M, Q; cin >> N >> M >> Q; mapcomp; vectorA(N); for (int i = 0;i < N;i++) { cin >> A[i]; } vector>>E(M); for (int i = 0;i < M;i++) { cin >> E[i].second.first >> E[i].second.second >> E[i].first; comp[E[i].first] = -1; E[i].second.first--; E[i].second.second--; } int cc = 0; vectorinv(comp.size() + 1); for (auto itr = comp.begin();itr != comp.end();itr++) { (*itr).second = cc; inv[cc] = (*itr).first; cc++; } for (int i = 0;i < M;i++) { E[i].first = comp[E[i].first]; } inv[comp.size()] = -1; sort(E.begin(), E.end()); vector>QS(Q); vectortop(Q, comp.size()), bot(Q, -1); for (int i = 0;i < Q;i++) { cin >> QS[i].first >> QS[i].second; QS[i].first--; if (QS[i].second == 1) { top[i] = -1; } } while (1) { vector>mids; for (int i = 0;i < Q;i++) { if (top[i] - bot[i] > 1) { mids.push_back({ (top[i] + bot[i]) / 2, i }); } } if (mids.size() == 0)break; sort(mids.begin(), mids.end()); init(A); int p = 0; int pm = 0; int cur = 0; for (p = 0;p < M;cur++) { while (p < M && E[p].first <= cur) { unite(E[p].second.first, E[p].second.second); p++; } while (pm < mids.size() && mids[pm].first == cur) { if (SS[find(QS[mids[pm].second].first)].size() >= QS[mids[pm].second].second) { top[mids[pm].second] = cur; } else { bot[mids[pm].second] = cur; } pm++; } } } for (int i = 0;i < Q;i++) { if (top[i] >= 0) { top[i] = inv[top[i]]; } else { top[i] = 0; } cout << top[i] << "\n"; } return; } #ifdef RANDOMTEST_DEBUG void solve_Brute_Force() { return; } #endif int main() { #ifdef RANDOMTEST_DEBUG int TESTCASES = 100; while (TESTCASES--) { solve(); solve_Brute_Force(); cout << endl; } #else int TESTCASES = 1; //cin >> TESTCASES; while (TESTCASES--) { solve(); } #endif return 0; }