#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ll long long
#define pii pair <int ,int >
#define fi first
#define se second
#define all(dataStructure) dataStructure.begin(), dataStructure.end()
#define debug {cout << "chaizo\n"; exit(0);}
using namespace std;
const int N = 1e5;
const ll inf32 = 1e9;
const ll inf64 = 1e18;
const int LOG = 26;
const int BLOCK = 400;
const int base = 3e7;
int n , m , q;
int type[N + 5] , x[N + 5] , y[N + 5];
int u[N + 5] , v[N + 5] , w[N + 5];
int ans[N + 5];
int Musashi_Miyamoto[N + 5] , Sasaki_Kojiro[N + 5] , cntA , cntB;
bool isChange[N + 5];
vector < int > FitChange[BLOCK + 5] , Query;
void init() {
std::ios_base::sync_with_stdio(0);
std::cin.tie(nullptr); std::cout.tie(nullptr);
#define TASK "Bridges"
if (fopen(TASK".INP", "r")) {
freopen(TASK".INP", "r", stdin);
freopen(TASK".OUT", "w", stdout);
}
}
struct DSU
{
int lab[N + 5];
pii history[2 * N + 5];
int id = 0;
void resz(int nn){
for(int i = 1 ; i <= nn ; i ++) lab[i] = -1;
id = 0;
}
int find_set(int u){
return lab[u] < 0 ? u : lab[u] = find_set(lab[u]);
}
void join(int u , int v)
{
u = find_set(u);
v = find_set(v);
if(u == v) return;
history[++id] = {u , lab[u]};
history[++id] = {v , lab[v]};
if(lab[u] > lab[v]) swap(u , v);
lab[u] += lab[v];
lab[v] = u;
return;
}
void rollback(int past)
{
while(id > past)
{
lab[history[id].fi] = history[id].se;
id --;
}
}
} dsu;
void process() {
for(int l = 1 ; l <= q ; l += BLOCK)
{
int r = min(l + BLOCK - 1 , q);
//reset
dsu.resz(n + 2); cntA = cntB = 0;
Query.clear();
//pre process
for(int i = l ; i <= r ; i ++)
{
if(type[i] == 1) isChange[x[i]] = true;
else Query.emplace_back(i);
FitChange[i - l].clear();
}
for(int i = 1 ; i <= m ; i ++)
{
if(isChange[i]) Musashi_Miyamoto[++cntA] = i;
else Sasaki_Kojiro[++cntB] = i;
}
sort(Sasaki_Kojiro + 1 , Sasaki_Kojiro + cntB + 1 , [](int i , int j) {
return w[i] > w[j];
});
sort(all(Query) , [](int i , int j){
return y[i] > y[j];
});
for(int i = l ; i <= r ; i ++)
{
if(type[i] == 1) w[x[i]] = y[i];
else
{
for(int j = 1 ; j <= cntA ; j ++)
if(w[Musashi_Miyamoto[j]] >= y[i])
FitChange[i - l].emplace_back(Musashi_Miyamoto[j]);
}
}
//for(int i = 1 ; i <= cntB ; i ++) cout << Sasaki_Kojiro[i] << ' '; cout << '\n';
//for(int &i : Query) cout << i << ' '; cout << '\n';
int j = 1; int nc = 0;
for(int i : Query)
{
while(j <= cntB && w[Sasaki_Kojiro[j]] >= y[i])
{
dsu.join(u[Sasaki_Kojiro[j]], v[Sasaki_Kojiro[j]]);
j++;
}
int timeline = dsu.id;
for(int e : FitChange[i - l])
dsu.join(u[e] , v[e]);
ans[i] = dsu.lab[dsu.find_set(x[i])];
dsu.rollback(timeline);
}
for(int i = l ; i <= r ; i ++) if(type[i] == 1) isChange[x[i]] = false;
}
for(int i = 1 ; i <= q ; i ++) if(type[i] == 2) cout << 0 - ans[i] << '\n';
}
void read() {
cin >> n >> m;
for(int i = 1 ; i <= m ; i ++) cin >> u[i] >> v[i] >> w[i];
cin >> q;
for(int i = 1 ; i <= q ; i ++) cin >> type[i] >> x[i] >> y[i];
}
int main() {
init();
int test_case;
//cin >> test_case;
test_case = 1;
while (test_case--) {
read();
process();
}
return 0;
}
Compilation message (stderr)
bridges.cpp: In function 'void init()':
bridges.cpp:34:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
34 | freopen(TASK".INP", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:35:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
35 | freopen(TASK".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... |