#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define ld long double
#define show(x,y) cout << y << " " << #x << endl;
#define show2(x,y,i,j) cout << y << " " << #x << " " << j << " " << #i << endl;
#define show3(x,y,i,j,p,q) cout << y << " " << #x << " " << j << " " << #i << " " << q << " " << #p << endl;
#define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl;
typedef pair<int,int>pii;
mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());
struct DSU{
vector<int>e;
vector<array<int,4>>stk;
void init(int n){
e=vector<int>(n,-1);
}
int get(int x){
return e[x]<0?x:get(e[x]);
}
bool unite(int x, int y){
x=get(x); y=get(y);
if(x==y) return 0;
if(e[x]>e[y]) swap(x,y);
stk.push_back({x,y,e[x],e[y]});
e[x]+=e[y];
e[y]=x;
return 1;
}
void rollback(){
array<int,4>hold=stk.back();
stk.pop_back();
//x y e[x] e[y]
e[hold[0]]=hold[2];
e[hold[1]]=hold[3];
}
};
const int blk=400;
bool cmp(const array<int,3>&a, const array<int,3>&b){
return a[1]>b[1];
}
void solve(){
int n,m;
cin >> n >> m;
array<int,3>arr[m];
set<pair<pii,pii>,greater<>>edge;
pii storage[m];
for(int x=0;x<m;x++){
cin >> arr[x][0] >> arr[x][1] >> arr[x][2];
edge.insert({{arr[x][2],arr[x][0]},{arr[x][1],x}});
storage[x]={arr[x][0],arr[x][1]};
}
int q;
cin >> q;
vector<array<int,3>>que[500];
vector<array<int,3>>upd[500];
int temp,temp2,temp3;
for(int x=0;x<q;x++){
cin >> temp >> temp2 >> temp3;
if(temp==1){
temp2--;
upd[x/blk].push_back({temp2,temp3,x});
}
else{
que[x/blk].push_back({temp2,temp3,x});
}
}
vector<pii>ans;
for(int x=0;x<(q/blk)+1;x++){
//rebuild structure
bitset<100005>bs;
vector<int>notake;
for(auto it:upd[x]){
int index=it[0];
bs[index]=true;
notake.push_back(index);
}
DSU dsu;
dsu.init(n+5);
auto ptr=edge.begin();
sort(que[x].begin(),que[x].end(),cmp);
for(auto it:que[x]){
while(ptr!=edge.end()&&ptr->first.first>=it[1]){
if(!bs[ptr->second.second]){
dsu.unite(ptr->first.second,ptr->second.first);
}
ptr++;
}
int counter=0;
vector<pii>undo;
for(auto brute:upd[x]){
if(brute[2]<it[2]){
undo.push_back({brute[0],arr[brute[0]][2]});
arr[brute[0]][2]=brute[1];
}
}
for(auto brute:notake){
if(arr[brute][2]>=it[1]){
counter+=dsu.unite(arr[brute][1],arr[brute][0]);
}
}
ans.push_back({it[2],-dsu.e[dsu.get(it[0])]});
for(int y=0;y<counter;y++) dsu.rollback();
while(!undo.empty()){
arr[undo.back().first][2]=undo.back().second;
undo.pop_back();
}
}
for(auto it:upd[x]){
int index=it[0];
pair<pii,pii>hold={{arr[index][2],arr[index][0]},{arr[index][1],index}};
edge.erase(hold);
arr[index][2]=it[1];
hold.first.first=it[1];
edge.insert(hold);
}
}
sort(ans.begin(),ans.end());
for(auto it:ans) cout << it.second << "\n";
}
int32_t main(){
ios::sync_with_stdio(0);
cin.tie(0);
int t=1;
//cin >> t;
while(t--){
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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |