思路是逆序进行并查集,哎它不是要求最大的最短边长,那么考虑每次加边是最长的边 是不是在第一次抵达某个联通快个数这个状态的时候,最短边就是最大的当前状态 然后在考虑它给的是l,r,事实上要最大,一定得选r处
/*
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
typedef pair<int,int> pi ;
#define if1(x) for(int i =1 ;i<=x;i++)
#define if0(x) for(int i = 0;i<x;i++)
#define jf0(x) for(int j = 0;j<x;j++)
#define jf1(x) for(int j = 1;j<=x;j++)
#define pb push_back
const int mod = 1e9+7;
const int inf = 1e18;
const int N = 2e5+10;
int f[N];
int find(int u)
{
if(f[u] ==u) return u;
else return f[u] = find(f[u]);
}
void solve(){
int m,n,q;
cin>>n>>m>>q;
if1(n) f[i] = i;
vector<array<int,3> > edg;
if0(m){
int a,b,c;
cin>>a>>b>>c;
if(b!=a)
edg.push_back({c,a,b});
}
sort(edg.rbegin(), edg.rend());
vector<int> ans(n+1,inf);
int now = n-1;
if0(edg.size()){
if(find(edg[i][2]) == find(edg[i][1])){
f[find (edg[i][1]) ] = find(edg[i][2]);
}
else {
ans[now] = edg[i][0];
now--;
f[find (edg[i][1]) ] = find(edg[i][2]);
}
}
while(q--){
int l,r;
cin>>l>>r;
if(ans[r] == inf) cout<<"NO ANSWER\n";
else
cout<<ans[r]<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t=1;
// cin>>t;
while (t--)
{
solve();
}
return 0;
}
}