#pragma GCC optimize("O3") #include #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define files(name) name!=""?freopen(name".in","r",stdin),freopen(name".out","w",stdout):0 #define all(a) a.begin(),a.end() #define len(a) (int)(a.size()) #define elif else if #define mp make_pair #define pb push_back #define fir first #define sec second using namespace std; ///#define int long long typedef unsigned long long ull; typedef pair pii; typedef vector vi; typedef long double ld; typedef long long ll; const int arr=2e5+10; const int ar=2e3+10; const ld pi=acos(-1); const ld eps=1e-10; const ll md=1e9+7; ///---program start---/// ll inf=1e18; struct segment_tree { int n; vector t; vector push; segment_tree() { n=0; t.clear(); push.clear(); } segment_tree(int n) { this->n=n; t.assign(4*n+10,-inf); push.assign(4*n+10,-inf); } void make_push(int v) { if (push[v]==-inf){ return; } t[v*2]=max(t[v*2],push[v]); t[v*2+1]=max(t[v*2+1],push[v]); push[v*2]=max(push[v*2],push[v]); push[v*2+1]=max(push[v*2+1],push[v]); push[v]=-inf; } void upd(int v,int l,int r,int tl,int tr,ll val) { if (l>tr||rtr){ return; } if (l>=tl&&r<=tr){ t[v]=max(t[v],val); push[v]=max(push[v],val); return; } make_push(v); int m=(l+r)/2; upd(v*2,l,m,tl,tr,val); upd(v*2+1,m+1,r,tl,tr,val); t[v]=max(t[v*2],t[v*2+1]); } ll get(int v,int l,int r,int tl,int tr) { if (l>tr||rtr){ return -inf; } if (l>=tl&&r<=tr){ return t[v]; } make_push(v); int m=(l+r)/2; return max( get(v*2,l,m,tl,tr), get(v*2+1,m+1,r,tl,tr) ); } ll get(int l,int r) { if (l<=r){ return get(1,1,n,l,r); } else{ return max( get(1,1,n,1,r), get(1,1,n,l,n) ); } } void upd(int l,int r,ll val) { if (l<=r){ upd(1,1,n,l,r,val); } else{ upd(1,1,n,1,r,val); upd(1,1,n,l,n,val); } } }; #define arr (int)(1e6+10) int tin[arr]; int tout[arr]; int T; vi reb[arr]; const int M=20; int p[arr][M]; void dfs1(int v,int pred) { p[v][0]=pred; for (int i=1;i=tout[v]; } int n,S,P; segment_tree ST; int get_next(int u,int v) /// u is pred v { for (int i=M-1;i>=0;i--){ if (is_pred(u,p[v][i])&&u!=p[v][i]){ v=p[v][i]; } } return v; } void upd_way(int u,int v,ll r,ll t) { if (is_pred(u,v)){ ll val1=ST.get(tin[v],tout[v]); int kek=get_next(u,v); ll val2=ST.get(tout[kek]+1,tin[kek]-1); if (val1>r){ val1+=t; ST.upd(tout[kek]+1,tin[kek]-1,val1); } if (val2>r){ val2+=t; ST.upd(tin[v],tout[v],val2); } } elif (is_pred(v,u)){ swap(u,v); ll val1=ST.get(tin[v],tout[v]); int kek=get_next(u,v); ll val2=ST.get(tout[kek]+1,tin[kek]-1); if (val1>r){ val1+=t; ST.upd(tout[kek]+1,tin[kek]-1,val1); } if (val2>r){ val2+=t; ST.upd(tin[v],tout[v],val2); } } else{ ll val1=ST.get(tin[v],tout[v]); ll val2=ST.get(tin[u],tout[u]); if (val1>r){ val1+=t; ST.upd(tin[u],tout[u],val1); } if (val2>r){ val2+=t; ST.upd(tin[v],tout[v],val2); } } } void debug() { for (int i=1;i<=n;i++){ cout<>n>>S>>P; for (int i=1;i<=n;i++){ reb[i].clear(); } T=0; for (int i=1;i>u>>v; reb[u].pb(v); reb[v].pb(u); } dfs1(1,1); ST=*new segment_tree(n); ST.upd(tin[S],tin[S],P); int m; cin>>m; while (m--){ ll u,v,r,t; cin>>u>>v>>r>>t; upd_way(u,v,r,t); // debug(); } cout<>test; while (test--){ solve(); } }