比赛 2026.4.11 评测结果 AAAAAAAAAAA
题目名称 rldcot 最终得分 100
用户昵称 RpUtl 运行时间 2.264 s
代码语言 C++ 内存使用 21.02 MiB
提交时间 2026-04-11 12:11:33
显示代码纯文本
#include <bits/stdc++.h>
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int N=1e5+10;
const int M=5e5+10;
int ver[N],to[N<<1],nxt[N<<1],val[N<<1],idx;
int siz[N],son[N],n,m,q,l[M],ans[M],pos[N];
long long c[N],b[N];
set<int>st; 
vector<pii>p[N];
vector<int>Q[N];
struct BIT{
	int c[N];
	void add(int x,int y){
		for(;x<=n;x+=(x&-x))c[x]+=y;
	}
	int ask(int x){
		int cnt=0;
		for(;x>0;x-=(x&-x))cnt+=c[x];
		return cnt;
	}
	int qry(int l,int r){
		return ask(r)-ask(l-1); 
	}
}tr;
void add(int x,int y,int z){
	to[++idx]=y,nxt[idx]=ver[x],ver[x]=idx,val[idx]=z;
}
void dfs(int x,int fa){
	siz[x]=1;
	for(int i=ver[x],y;i;i=nxt[i]){
		if(to[i]==fa)continue;
		c[to[i]]=c[x]+val[i];
		dfs(to[i],x);
		siz[x]+=siz[to[i]];
		if(siz[to[i]]>siz[son[x]]){
			son[x]=to[i];
		}
	}
	return;
}
int nxtx(int x){
	auto it=st.upper_bound(x);
	if(it==st.end())return -1;
	else return *it;
}
int prex(int x){
	if(x<*st.begin())return -1;
	auto it=st.lower_bound(x);
	return *(--it);
}
void ins(int x,int fa){
	st.insert(x);
	for(int i=ver[x];i;i=nxt[i]){
		if(to[i]!=fa)ins(to[i],x);
	}
	return;
}
void find(int x,int col){
	int u=prex(x),v=nxtx(x);
	if(u!=-1)p[x].push_back(mp(u,col));
	if(v!=-1)p[v].push_back(mp(x,col));
	return;
}
void calc(int x,int fa,int col){
	find(x,col);
	for(int i=ver[x];i;i=nxt[i]){
		if(to[i]!=fa)calc(to[i],x,col);
	}
	return;
}
void DFS(int x,int fa,int o){
	for(int i=ver[x],y;i;i=nxt[i]){
		if(to[i]!=fa&&to[i]!=son[x]){
			DFS(to[i],x,0);
		}
	}
	if(!son[x]){
		if(o)st.insert(x);
		return;
	}
	DFS(son[x],x,1);
	find(x,c[x]);st.insert(x);
	for(int i=ver[x];i;i=nxt[i]){
		if(to[i]!=fa&&to[i]!=son[x]){
			calc(to[i],x,c[x]);
			ins(to[i],x);
		}
	}
	if(!o)st.clear();
	return;
}
int main(){
	freopen("rldcot.in","r",stdin);
	freopen("rldcot.out","w",stdout);
	scanf("%d %d",&n,&q);
	for(int i=1,u,v,w;i<n;i++){
		scanf("%d %d %d",&u,&v,&w);
		add(u,v,w),add(v,u,w); 
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)b[i]=c[i];
	sort(b+1,b+1+n);m=unique(b+1,b+1+n)-(b+1);
	for(int i=1;i<=n;i++){
		c[i]=lower_bound(b+1,b+1+m,c[i])-b;
		p[i].push_back(mp(i,c[i]));
	}
	DFS(1,0,0);
	for(int i=1,r;i<=q;i++){
		scanf("%d %d",l+i,&r);
		Q[r].push_back(i);
	}
	for(int i=1;i<=n;i++){
		for(auto j:p[i]){
			if(j.fi>pos[j.se]){
				if(pos[j.se])tr.add(pos[j.se],-1);
				pos[j.se]=j.fi;tr.add(pos[j.se],1);
			}
		}
		for(auto j:Q[i]){
			ans[j]=tr.qry(l[j],i);
		}
	}
	for(int i=1;i<=q;i++){
		printf("%d\n",ans[i]);
	}
	 
	return 0;
}