#include<bits/stdc++.h> #define fru(i,j,k) for(int i=j;i<=k;i++) #define frd(i,j,k) for(int i=j;i>=k;i--) #define fio(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout); using namespace std; using ll = long long; char c=' '; int in(void) { int x=0;bool f=false; while(!isdigit(c)){f^=c=='-';c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return f?-x:x; } const int maxn=100012; int n,m,q,Sz,tp[maxn],ml[maxn],sz[maxn],tot,sta[maxn],fa[maxn],al[maxn],bl[maxn],wl[maxn],tl[maxn],pl[maxn]; struct edg { int w,id; bool operator<(const edg y)const { return w!=y.w?w>y.w:id<y.id; } }; set<edg>st; list<edg>stk; struct qry { int tp,ml,w,id,ans; }ql[maxn]; inline bool cmpq(const qry x,const qry y) { return x.w>y.w; } inline bool cmpqb(const qry x,const qry y) { return x.id<y.id; } int fdf(int x){while(x^fa[x])x=fa[x];return x;} void mge(int a,int b) { a=fdf(a);b=fdf(b); if(a^b) { if(sz[a]>sz[b])swap(a,b); sz[b]+=sz[a];fa[a]=b;sta[++tot]=a; } } void undo(int x) { int dc; while(sta[tot]^x) { dc=sta[tot--]; sz[fa[dc]]-=sz[dc]; fa[dc]=dc; } } bool b[maxn]; int main() { n=in();m=in(); fru(i,1,n) { sz[i]=1; fa[i]=i; } fru(i,1,m) { al[i]=in();bl[i]=in();wl[i]=in(); st.emplace((edg){wl[i],i}); } q=in();Sz=max((int)sqrt(n*__lg(n)),1); fru(i,1,q) { ql[i].tp=in();ql[i].ml=in();ql[i].w=in();ql[i].id=i; } int bk,stab;auto dc=st.begin(); for(int i=1;i<=q;i+=Sz) { bk=min(q,i+Sz-1); fru(j,1,m)b[j]=false; fru(j,i,bk) if(ql[j].tp==1) { b[ql[j].ml]=true;stk.emplace_back((edg){wl[ql[j].ml],ql[j].ml}); } sort(ql+i,ql+bk+1,cmpq); dc=st.begin(); undo(0); fru(j,i,bk) if(ql[j].tp==2) { for(;dc!=st.end();++dc) { if((*dc).w>=ql[j].w) { if(!b[(*dc).id])mge(al[(*dc).id],bl[(*dc).id]); } else break; } stab=sta[tot]; for(auto k:stk) { tl[k.id]=0;pl[k.id]=wl[k.id]; } fru(k,i,bk) if(ql[k].tp==1&&ql[k].id<ql[j].id) { if(tl[ql[k].ml]<ql[k].id) { tl[ql[k].ml]=ql[k].id; pl[ql[k].ml]=ql[k].w; } } for(auto k:stk) { if(pl[k.id]>=ql[j].w)mge(al[k.id],bl[k.id]); } ql[j].ans=sz[fdf(ql[j].ml)]; undo(stab); } for(auto j:stk) { st.erase(j); } stk.clear(); sort(ql+i,ql+bk+1,cmpqb); fru(j,i,bk) if(ql[j].tp==1) { wl[ql[j].ml]=ql[j].w; } fru(j,i,bk) if(ql[j].tp==1&&wl[ql[j].ml]==ql[j].w) { st.emplace((edg){ql[j].w,ql[j].ml}); } } sort(ql+1,ql+q+1,cmpqb); fru(i,1,q) { if(ql[i].tp==2) { printf("%d\n",ql[i].ans); } } return 0; }
|