Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
39943 LYLAKIOIAKIOI 【S】T1 C++ 通过 100 1997 MS 500600 KB 2640 2026-02-09 20:16:16

Tests(10/10):


#include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define mk make_pair #define GT(x,y) get<y>(x) #define mt make_tuple using namespace std; const int N=4e6+10; struct IO{ char buf[1<<20],*S=buf,*E=buf; inline char gc(){ (S==E)&&(E=(S=buf)+fread(buf,1,1<<20,stdin)); return S==E?EOF:*S++; } char buf2[1<<20];int topp=0; inline void flush(){ fwrite(buf2,1,topp,stdout);topp=0; } inline void pc(char c){ buf2[topp++]=c; if(topp==(1<<20)) fwrite(buf2,1,topp,stdout),topp=0; } inline int read(){ int t=0,f=1;char ch=gc(); while(!isdigit(ch)){ if(ch=='-') f=-1;ch=gc(); }while(isdigit(ch)) t=t*10+ch-'0',ch=gc(); return t*f; }char sta[22]; inline void write(long long x){ int top=0;(x<0)?pc('-'),x=-x:x=x; if(x==0) pc('0'); while(x>0) sta[++top]=x%10+'0',x/=10; while(top>0) pc(sta[top--]); } ~IO(){flush();} IO &operator>>(int &n){n=read();return *this;} IO &operator<<(int n){write(n);return *this;} IO &operator<<(char ch){pc(ch);return *this;} }fastio; int ans[N],cnt[N],val[N]; vector<pii> a[N],b[N]; tuple<int,int,int> A[N],B[N];int n,q,top=0; int buc[N]; int main(){ //freopen("count.in","r",stdin); //freopen("count.out","w",stdout); fastio>>n>>q;top=0; for(int i=1;i<=n;i++) fastio>>val[i]; for(int i=1;i<n;i++){ int u,v;fastio>>u>>v; A[++top]=mt(u,val[v],v); A[++top]=mt(v,val[u],u); } for(int i=1;i<=top;i++) buc[GT(A[i],2)]++; for(int i=1;i<=n;i++) buc[i]+=buc[i-1]; for(int i=top;i>=1;i--) B[buc[GT(A[i],2)]--]=A[i]; for(int i=1;i<=top;i++) a[GT(B[i],0)].emplace_back(GT(B[i],2),GT(B[i],1)); top=0; for(int i=1;i<=q;i++){ int x,l,r;fastio>>x>>l>>r; A[++top]=mt(x,i,r);A[++top]=mt(x,i,l-1); } for(int i=1;i<=n;i++) buc[i]=0; for(int i=1;i<=top;i++) buc[GT(A[i],2)]++; for(int i=1;i<=n;i++) buc[i]+=buc[i-1]; for(int i=top;i>=1;i--) B[buc[GT(A[i],2)]--]=A[i]; for(int i=1;i<=top;i++) b[GT(B[i],0)].emplace_back(GT(B[i],2),GT(B[i],1)); for(int i=1;i<=n;i++){ int it1=0,it2=0,sz1=a[i].size(),sz2=b[i].size(),now=0; a[i].emplace_back(1e9,0);b[i].emplace_back(1e9,0); while(it1<sz1||it2<sz2){ if(a[i][it1].fi<=b[i][it2].fi){ now+=a[i][it1].se;it1++; }else{ ans[b[i][it2].se]=now-ans[b[i][it2].se];it2++; } } }for(int i=1;i<=q;i++) fastio<<ans[i]<<'\n'; return 0; }


测评信息: