Submission #1219378

#TimeUsernameProblemLanguageResultExecution timeMemory
1219378boclobanchatBridges (APIO19_bridges)C++20
100 / 100
2125 ms7096 KiB
#include<bits/stdc++.h>
using namespace std;
struct edge { int l,r,v; };
struct query { int t,idx,v; };
const int MAXN=1e5+5;
const int sqr=600;
int dsu[MAXN],cnt[MAXN],ans[MAXN],len[MAXN],idx[MAXN],pre[MAXN],o[MAXN];
edge E[MAXN],e2[MAXN];
query Q[MAXN];
bool ck[MAXN];
stack< pair<int,int> > st;
bool comp(edge a,edge b) { return a.v>b.v; }
bool comp2(int a,int b) { return Q[a].v>Q[b].v; }
int root(int i)
{
	if(!dsu[i]) return i;
	return root(dsu[i]);
}
void merge(int i,int j)
{
	if((i=root(i))==(j=root(j)))
	{
		st.push({-1,-1});
		return ;
	}
	if(cnt[i]<cnt[j]) swap(i,j);
	dsu[j]=i,cnt[i]+=cnt[j],st.push({i,j});
}
void rollback()
{
	pair<int,int> a=st.top();
	st.pop();
	if(a.first<0) return ;
	dsu[a.second]=0,cnt[a.first]-=cnt[a.second];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m,q;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
    	int l,r,v;
    	cin>>l>>r>>v;
    	E[i]={l,r,v};
	}
	for(int i=1;i<=n;i++) cnt[i]=1;
	cin>>q;
	int preq=1;
	for(int i=1;i<=q;i++)
	{
		idx[i]=i;
		cin>>Q[i].t>>Q[i].idx>>Q[i].v;
		if(i==q||i%sqr==0)
		{
			int cnt1=0,r=1,cnt2=0;
			for(int j=preq;j<=i;j++) if(Q[j].t==1) ck[Q[j].idx]=true;
			for(int j=1;j<=m;j++) if(!ck[j]) e2[++cnt1]=E[j];
			else o[++cnt2]=j,len[j]=E[j].v;
			sort(e2+1,e2+cnt1+1,comp);
			sort(idx+preq,idx+i+1,comp2);
			for(int j=preq;j<=i;j++)
			{
				int p=idx[j];
				if(Q[p].t==2)
				{
					while(r<=cnt1&&e2[r].v>=Q[p].v) merge(e2[r].l,e2[r].r),r++;
					for(int k=1;k<=cnt2;k++) pre[o[k]]=len[o[k]];
					for(int k=preq;k<p;k++) if(Q[k].t==1) len[Q[k].idx]=Q[k].v;
					for(int k=1;k<=cnt2;k++) if(len[o[k]]>=Q[p].v) merge(E[o[k]].l,E[o[k]].r);
					ans[p]=cnt[root(Q[p].idx)];
					for(int k=1;k<=cnt2;k++) 
					{
						if(len[o[k]]>=Q[p].v) rollback();
						len[o[k]]=pre[o[k]];
					}
				}
			}
			for(int j=preq;j<=i;j++) if(Q[j].t==1) ck[Q[j].idx]=false,E[Q[j].idx].v=Q[j].v;
			else cout<<ans[j]<<"\n";
			while(!st.empty()) rollback();
			preq=i+1;
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...