类似于NOI2018d1t1的离线做法,把询问存下来,排个序,然后倒着给并查集加边,每次询问并查集联通块大小
#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
const int maxn=; inline ll rd(){
ll x=;char c=getchar();
while(c<''||c>'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x;
} struct Edge{
int a,b,l;
}eg[maxn],que[maxn];
int N,M;
int fa[maxn],siz[maxn],ans[maxn]; inline bool cmp(Edge a,Edge b){
return a.l>b.l;
} int getf(int x){return x==fa[x]?x:fa[x]=getf(fa[x]);}
inline void add(int a,int b){
int x=getf(a),y=getf(b);
fa[x]=y;siz[y]+=siz[x];
} int main(){
int i,j,k;
N=rd(),M=rd();
for(i=;i<N;i++){
eg[i].a=rd(),eg[i].b=rd(),eg[i].l=rd();
}for(i=;i<=M;i++){
que[i].l=rd(),que[i].a=rd();
que[i].b=i;
}
for(i=;i<=N;i++) fa[i]=i,siz[i]=;
sort(eg+,eg+N,cmp);sort(que+,que+M+,cmp);
for(i=,j=;i<=M;i++){
for(;j<N&&eg[j].l>=que[i].l;j++) add(eg[j].a,eg[j].b);
ans[que[i].b]=siz[getf(que[i].a)];
}
for(i=;i<=M;i++) printf("%d\n",ans[i]-);
}