#include <bits/stdc++.h>
using namespace std;
#define sonic ios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define IO(main) if(fopen(main".inp","r")){freopen(main".inp","r",stdin);freopen(main".out","w",stdout);}
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define ins insert
#define pb push_back
#define el cout << endl
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
#define MASK(i) ((1LL)<<(i))
#define BIT(x,i) (((x)>>(i))&(1LL))
#define FOR(i, a, b) for(int (i)=(a);(i)<=(b); i++)
#define FORD(i, a, b) for(int (i)=(a);(i)>=(b); i--)
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vii = vector<pii>;
const int N = 2e5 + 9;
const int mod = 1e9 + 7;
const ll INF = 1e18 + 7;
const int base = 31;
const int LOG = 20;
const ll MOD = 1e9 + 7;
int mul(int x, int y) {return 1LL * x * y % mod;}
int calPw(int x, int y)
{
int ans = 1;
while(y)
{
if (y&1) ans = 1LL * ans * x % mod;
x = 1LL * x * x % mod;
y >>= 1;
}
return ans;
}
int d4x[4] = {1, 0, -1, 0};
int d4y[4] = {0, 1, 0, -1};
int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[8] = {1, 1, 0, -1, -1, -1, 0, 1};
///Author: Le Chi Thien Luong The Vinh high school 2008
///code
template<class X, class Y>
bool minimize(X &x , Y y){
if(x > y){
x = y;
return true;
}
return false;
}
template<class X, class Y>
bool maximize(X &x , Y y){
if(x < y){
x = y;
return true;
}
return false;
}
template<class X, class Y>
bool add(X &x , Y y){
if((x + y ) >= mod){
ll tmp = x + y;
x = tmp - mod;
return true;
}
return false;
}
void Solve(){
}
struct edge{
int u, v, w;
bool operator<(const edge& a) const {
return w < a.w;
}
}e[N];
struct query {
int u, v, w, id;
bool operator<(const query& a) const {
return w < a.w;
}
}qr[N];
int n, m, q;
int lab[N];
int Find(int u){
if(lab[u] < 0)return u;
lab[u] = Find(lab[u]);
return lab[u];
}
bool dsu(int u, int v){
u = Find(u);
v = Find(v);
if(u == v)return false;
if(lab[u] > lab[v])swap(u, v);
lab[u] += lab[v];
lab[v] = u;
return true;
}
bool check(int u, int v, int w){
FOR(i, 1, n)lab[i] = -1;
FOR(i, 1, m){
if(e[i].w <= w){
dsu(e[i].u, e[i].v);
}
}
return (Find(u) == Find(v));
}
string ans[N];
void Read(){
cin >> n >> m >> q;
int ok = 1;
FOR(i, 1, m){
int u, v, w;
cin >> u >> v >> w;
e[i] = {u, v, w};
if(i >= 2){
if(e[i].w != e[i - 1].w)ok = 0;
}
}
if(1LL * n * m <= 10000000){
if(ok == 1){
FOR(i, 1, n)lab[i] = -1;
FOR(i, 1, m){
dsu(e[i].u, e[i].v);
}
}
while(q--){
int u, v, w;
cin >> u >> v >> w;
string ans = "NE";
if(ok == 1){
if(w >= e[1].w && Find(u) == Find(v))ans = "TAIP";
cout << ans << endl;
continue;
}
if(check(u, v, w))ans = "TAIP";
cout << ans << endl;
}
return;
}
FOR(i, 1, n)lab[i] = -1;
FOR(i, 1, q){
int u, v, w;
cin >> u >> v >> w;
qr[i] = {u, v, w, i};
}
sort(qr + 1, qr + 1 + q);
sort(e + 1, e + 1 + m);
int p = 1;
FOR(i, 1, q){
int w = qr[i].w;
int l = 1, r = m;
int pos = -1;
while(l <= r){
int mid = l + r >> 1;
if(e[mid].w <=w){
l = mid + 1;
pos = mid;
}
else r = mid - 1;;
}
///cout << p << " " << pos << " " << w << endl;
if(p <= pos)
FOR(j, p, pos){
dsu(e[j].u, e[j].v);
}
if(Find(qr[i].u) == Find(qr[i].v)){
ans[qr[i].id] = "TAIP";
}
else ans[qr[i].id] = "NE";
}
FOR(i, 1, q)cout << ans[i] << endl;
}
int main()
{
sonic;
int TEST = 1;
// cin >> TEST;
while(TEST--)
{
Read();
Solve();
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |