This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
const int MAXM = 1e5;
const int MAXN = 5e4;
struct DSU{
private:
int id[MAXN+1];
public:
int sz[MAXN+1];
stack<int> rollback;
void set(int n){
iota(id, id + n, 0);
fill(sz, sz + n, 1);
}
int findset(int u){
while(id[u] != u) u = id[u];
return u;
}
void joinset(int u, int v){
int pu = findset(u), pv = findset(v);
if(pu == pv) return;
if(sz[pu] > sz[pv]) swap(pu, pv);
rollback.push(pu);
id[pu] = pv;
sz[pv] += sz[pu];
}
void disjoint(int x){
while(rollback.size() > x){
int u = rollback.top();
rollback.pop();
int v = id[u];
sz[v] -= sz[u];
id[u] = u;
}
}
int size(int u){
return sz[findset(u)];
}
}dsu;
struct edge{
int u, v, w;
};
edge ed[MAXM+1];
const int MAXQ = 1e5;
struct query{
int t, idx, w;
};
query q[MAXQ+1];
const int block_size = 316;
int res[MAXQ+1];
vector<int> upd, ask, keep, join[block_size + 1];
bitset<MAXM+1> vis;
#define clr(arr) arr.clear(), arr.shrink_to_fit()
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, M;
cin>> N>> M;
for(int i=1; i<=M; i++){
int u, v, w;
cin>> u>> v>> w;
ed[i] = {u, v, w};
}
int Q;
cin>> Q;
for(int i=0; i<Q; i++){
int t, idx, w;
cin>> t>> idx>> w;
q[i] = {t, idx, w};
}
for(int ini = 0, fin; ini < Q; ini = fin + 1){
fin = min(Q - 1, ini + block_size);
clr(upd), clr(ask), clr(keep);
vis.reset();
for(int i=ini; i<=fin; i++){
if(q[i].t == 1){
vis[q[i].idx] = 1;
}
else ask.push_back(i);
}
for(int i=1; i<=M; i++){
if(!vis[i]) keep.push_back(i);
else upd.push_back(i);
}
for(int i=ini; i<=fin; i++){
if(q[i].t == 1){
ed[q[i].idx].w = q[i].w;
}
else{
clr(join[i - ini]);
for(auto idx : upd){
if(ed[idx].w >= q[i].w) join[i - ini].push_back(idx);
}
}
}
sort(keep.begin(), keep.end(), [&](int x, int y){
return ed[x].w > ed[y].w;
});
sort(ask.begin(), ask.end(), [&](int x, int y){
return q[x].w > q[y].w;
});
int ptr = 0;
dsu.set(N+1);
for(auto i : ask){
while(ptr < keep.size() && ed[keep[ptr]].w >= q[i].w){
dsu.joinset(ed[keep[ptr]].u, ed[keep[ptr]].v);
ptr++;
}
int curr_sz = dsu.rollback.size();
for(auto j : join[i - ini]) dsu.joinset(ed[j].u, ed[j].v);
res[i] = dsu.size(q[i].idx);
dsu.disjoint(curr_sz);
}
}
for(int i=0; i<Q; i++) if(res[i] > 0) cout<< res[i]<< '\n';
return 0;
}
Compilation message (stderr)
bridges.cpp: In member function 'void DSU::disjoint(int)':
bridges.cpp:30:31: warning: comparison of integer expressions of different signedness: 'std::stack<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
30 | while(rollback.size() > x){
| ~~~~~~~~~~~~~~~~^~~
bridges.cpp: In function 'int main()':
bridges.cpp:112:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
112 | while(ptr < keep.size() && ed[keep[ptr]].w >= q[i].w){
| ~~~~^~~~~~~~~~~~~
# | 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... |