| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 39926 | 氩_wjy | 【S】T1 | C++ | 运行超时 | 90 | 2000 MS | 508788 KB | 2384 | 2026-02-09 19:42:10 |
#include<bits/stdc++.h> // #define int long long #define lb(x) ((x)&(-(x))) #define endl '\n' using namespace std; const int N=2e6+7; bool ST; vector<int> E[N]; int n,q,a[N],f[N],bfn[N],cnt; int Be[N],Fi[N]; int p[N],l[N],r[N]; int Ans[N]; inline void BFS(){ for(int i=1;i<=n;i++)Be[i]=1e9; queue<int> q; q.push(1); while(!q.empty()){ int u=q.front();q.pop(); bfn[u]=++cnt; for(auto v:E[u]){ if(v==f[u])continue; f[v]=u,q.push(v); } } for(int i=2;i<=n;i++){ Be[f[i]]=min(Be[f[i]],bfn[i]); Fi[f[i]]=max(Fi[f[i]],bfn[i]); } } struct OP{ int x,v,id,op; //op = 0 -> insert op = 1/-1 -> query OP(int _x=0,int _v=0,int _id=0,int _op=0){x=_x,v=_v,id=_id,op=_op;} }; vector<OP> qq[N]; int t[N]; bool ED; inline void Add(int x,int dt){ for(int i=x;i<=n;i+=lb(i))t[i]+=dt; } inline int Qry(int x){int Ans=0; for(int i=x;i;i-=lb(i))Ans+=t[i]; return Ans; } inline int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} return x; } inline void wr(int x){ if(x<10)return void(putchar(x+'0')); wr(x/10),putchar(x%10+'0'); } signed main(){ #ifndef ONLINE_JUDGE freopen("count.in","r",stdin); freopen("count.out","w",stdout); #endif n=read(),q=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=1;i<n;i++){ int u,v;u=read(),v=read(); E[u].push_back(v); E[v].push_back(u); } BFS(); for(int i=1;i<=n;i++)qq[i].push_back(OP(bfn[i],a[i],0,0)); for(int i=1;i<=q;i++){ p[i]=read(),l[i]=read(),r[i]=read(); Ans[i]+=(l[i]<=f[p[i]]&&f[p[i]]<=r[i])*a[f[p[i]]]; if(!Fi[p[i]])continue; qq[r[i]].push_back(OP(Fi[p[i]],0,i,1)); qq[r[i]].push_back(OP(Be[p[i]]-1,0,i,-1)); qq[l[i]-1].push_back(OP(Fi[p[i]],0,i,-1)); qq[l[i]-1].push_back(OP(Be[p[i]]-1,0,i,1)); } for(int i=1;i<=n;i++){ for(auto qr:qq[i]){ if(qr.op==0)Add(qr.x,qr.v); else Ans[qr.id]+=qr.op*Qry(qr.x); } } for(int i=1;i<=q;i++)wr(Ans[i]),putchar('\n'); fflush(stdout); // cerr<<abs(&ST-&ED)/1048576.0<<endl; return 0; }