提交时间:2026-02-09 20:11:32

运行 ID: 39939

#include<bits/stdc++.h> #pragma GCC optimize(3) #pragma GCC optimize("Ofast") void read(int &x){ x=0;char c=getchar();bool neg=0; for(;!isdigit(c);c=getchar())neg=(c=='-'); for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48); if(neg)x=-x; } #define read2(a,b) read(a),read(b) #define read3(a,b,c) read2(a,b),read(c) #define read4(a,b,c,d) read3(a,b,c),read(d) using namespace std; int n,q,a[2000005],d[2000005]; vector<int>e[2000005],s[2000005]; void slv(){ read2(n,q); for(int i=1;i<=n;i++)read(a[i]); for(int i=1;i<n;i++){ int u,v; read2(u,v); e[u].push_back(v); e[v].push_back(u); } for(int i=1;i<=n;i++){ d[i]=e[i].size(); e[i].push_back(0); sort(e[i].begin(),e[i].end()); s[i].resize(d[i]+1); for(int j=1;j<=d[i];j++)s[i][j]=s[i][j-1]+a[e[i][j]]; } while(q--){ int u,l,r; read3(u,l,r); int L=0,R=d[u],mid; while(L<R){ mid=(L+R+1>>1); if(e[u][mid]>=l)R=mid-1; else L=mid; } l=L; L=0,R=d[u],mid; while(L<R){ mid=(L+R+1>>1); if(e[u][mid]>r)R=mid-1; else L=mid; } r=L; printf("%d\n",s[u][r]-s[u][l]); } } signed main(){ slv(); return 0; }