//#pragma GCC optimize("O2")
//#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
using namespace std;
#define ALL(A) A.begin(), A.end()
#define FOR(i, a, b) for(int i = (a); i <= (int)(b); i++)
#define FORD(i, a, b) for(int i = (a); i >= (int)b; i--)
#define TIME (1.0 * clock() / CLOCKS_PER_SEC)
#define fi first
#define se second
const int oo = (int) 2e9;
const long long INF = (long long) 1e18;
const int MAXN = (int) 4e5 + 5;
int N, M, Q;
struct Edges {
int u, v, w;
} E[MAXN];
struct Queries {
int t;
int id, val;
int s, w;
int id_qry;
void input(void) {
cin >> t;
if (t == 1) cin >> id >> val;
else cin >> s >> w;
}
} Qry[MAXN];
namespace sub1 {
int lab[MAXN];
int find(int x) {
return lab[x] < 0 ? x : lab[x] = find(lab[x]);
}
bool joint(int u, int v) {
int x = find(u), y = find(v);
if (x == y) return 0;
if (lab[x] > lab[y]) swap(x, y);
lab[x]+= lab[y];
lab[y] = x;
return 1;
}
void solve() {
for (int q = 1; q <= Q; q++) {
int t = Qry[q].t;
if (t == 1) {
int id = Qry[q].id, val = Qry[q].val;
E[id].w = val;
continue;
}
int W = Qry[q].w, S = Qry[q].s;
for (int i = 1; i <= N; i++) lab[i] = - 1;
for (int i = 1; i <= M; i++) {
if (E[i].w >= W) {
joint(E[i].u, E[i].v);
}
}
cout << - lab[find(S)] << "\n";
}
}
}
namespace sub4 {
bool checksub() {
for (int i = 1; i <= Q; i++) if (Qry[i].t != 2) return 0;
return 1;
}
int lab[MAXN];
int find(int x) {
return lab[x] < 0 ? x : lab[x] = find(lab[x]);
}
bool joint(int u, int v) {
int x = find(u), y = find(v);
if (x == y) return 0;
if (lab[x] > lab[y]) swap(x, y);
lab[x]+= lab[y];
lab[y] = x;
return 1;
}
int ans[MAXN];
void solve() {
sort(Qry + 1, Qry + 1 + Q, [&](Queries u, Queries v) {
return u.w < v.w;
});
sort(E + 1, E + 1 + M, [&](Edges u, Edges v) {
return u.w < v.w;
});
for (int i = 1; i <= N; i++) lab[i] = - 1;
int j = M;
for (int i = Q; i >= 1; i--) {
while (j >= 1 && E[j].w >= Qry[i].w) {
joint(E[j].u, E[j].v);
j--;
}
ans[Qry[i].id_qry] = - lab[find(Qry[i].s)];
}
for (int i = 1; i <= Q; i++) cout << ans[i] << "\n";
}
}
void process() {
cin >> N >> M;
for (int i = 1; i <= M; i++) {
cin >> E[i].u >> E[i].v >> E[i].w;
}
cin >> Q;
for (int i = 1; i <= Q; i++) {
Qry[i].input();
Qry[i].id_qry = i;
}
if (Q <= 10000 && N <= 1000) return sub1 :: solve();
if (sub4 :: checksub()) return sub4 :: solve();
}
signed main(void) {
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
#define Hori ""
if (fopen(Hori".inp", "r")) {
freopen(Hori".inp", "r", stdin);
freopen(Hori".out", "w", stdout);
}
process();
return void(cerr << "KO :" << TIME << "s "), (0 ^ 0);
}
컴파일 시 표준 에러 (stderr) 메시지
bridges.cpp: In function 'int main()':
bridges.cpp:140:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
140 | freopen(Hori".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:141:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
141 | freopen(Hori".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |