不知道为什么有三个点多1.
#include <bits/stdc++.h>
using namespace std;
#define __int __int128
#define LL long long
#define DB double
#define PII pair<int,int>
#define Tp template<typename T>
#define Ts template<typename T,typename... _T>
Tp inline void read(T& x) {
x=0;char c=getchar();bool f=0;
for(;c<48||c>57;c=getchar()) f|=c=='-';
for(;c>47&&c<58;c=getchar()) x=x*10+c-48;
f&&(x=-x);
}
Ts inline void read(T& x,_T&... y) {read(x),read(y...);}
const int N=1e5+5;
int n;
struct node {
__int a,b,c;
}t[N];
struct edge {
int x,y,pre;
}a[N*2];int alen,last[N];
void ins(int x,int y) {
a[++alen]=edge{x,y,last[x]};
last[x]=alen;
}
PII lst[N];
__int calc(__int x,int i) {
if(t[i].c>=0) return x*t[i].b+(x+1)*x/2*t[i].c;
else {
__int p=min(x,max((__int)0,(__int)(1-t[i].b)/t[i].c));
return p*t[i].b+(p+1)*p/2*t[i].c+x-p;
}
}
int fa[N],vis[N];
void dfs(int x,int f) {
fa[x]=f;
for(int k=last[x];k;k=a[k].pre) {
int y=a[k].y;
if(y==f) continue;
dfs(y,x);
}
}
int res;
void update(int x,int sum) {
if(x==0||vis[x]) {
res+=sum;
return ;
}
update(fa[x],sum+1);
vis[x]=res-sum;
}
bool check(int lim) {
res=0;
for(int i=1;i<=n;i++) {
vis[i]=0;
lst[i].second=i;
__int val=calc(lim,i);
if(val<t[i].a) return 0;
int l=1,r=n;
while(l<r) {
int mid=(l+r+1)>>1;
if(val-calc(mid-1,i)>=t[i].a) l=mid;
else r=mid-1;
}
lst[i].first=l;
}
sort(lst+1,lst+1+n);
for(int i=1;i<=n;i++) {
update(lst[i].second,0);
if(vis[i]>lst[i].first) return 0;
}
return 1;
}
void write(int x) {
if(x/10) write(x/10);
putchar(x%10+'0');
}
signed main() {
read(n);
for(int i=1;i<=n;i++) read(t[i].a,t[i].b,t[i].c);
for(int i=1;i<n;i++) {
int x,y;read(x,y);
ins(x,y);ins(y,x);
}
dfs(1,0);
int l=1,r=1e9;
while(l<r) {
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}