提交时间:2022-07-13 13:10:33
运行 ID: 51701
#include <bits/stdc++.h> using namespace std; int n,m,u[100010],v[100010],w[100010],t[100010]; namespace T { #define mid (l+r>>1) #define ls k<<1 #define rs k<<1|1 int Tree[400010]; inline void BT(int l,int r,int k) { if(l==r) { Tree[k]=w[l]; return; } BT(l,mid,ls),BT(mid+1,r,rs); Tree[k]=max(Tree[ls],Tree[rs]); } inline int query(int l,int r,int k,int x,int y) { if(x<=l&&y>=r)return Tree[k]; int a,b; a=b=1e9; if(x<=mid) a=query(l,mid,ls,x,y); if(y>mid) b=query(mid+1,r,rs,x,y); return max(a,b); } void FindMax() { n--; BT(1,n,1); while(m--) { int x,y,r; cin>>x>>y>>r; cout<<r-query(1,n,1,x,y)<<endl; } exit(0); } #undef mid #undef ls #undef rs } void l() { } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n; for(int i=1; i<n; i++) cin>>u[i]>>v[i]>>w[i],t[w[i]]++; cin>>m; bool flag=1; for(int i=1; i<=n; i++) if(t[i]>1) { flag=0; break; } if(flag) T::FindMax(); bool S=1; for(int i=1; i<n; i++) if(u[i]==u[i-1]+1) S=0; if(S) l(); return 0; } //互 不相同->答案贡献来源于Alice一开始选不了->区间最大值