A
d d dd dd长链剖分与辣鸡 W O J WOJ WOJ
代码:
#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
#define pb push_back
using namespace std;
const int rlen=1<<18|1;
char buf[rlen],*ib=buf,*ob=buf;
#define gc() (((ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin)),ib==ob)?-1:*ib++)
typedef pair<int,int> pii;
typedef long long ll;
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
const int mod=998244353;
inline int add(int a,int b){
return (a+=b)<mod?a:a-mod;}
inline int dec(int a,int b){
return (a-=b)<0?a+mod:a;}
inline int mul(int a,int b){
return (ll)a*b%mod;}
inline void Add(int&a,int b){
(a+=b)<mod?a:(a-=mod);}
inline void Dec(int&a,int b){
(a-=b)<0?(a+=mod):a;}
inline void Mul(int&a,int b){
a=(ll)a*b%mod;}
inline int ksm(int a,int p){
int ret=1;for(;p;p>>=1,Mul(a,a))if(p&1)Mul(ret,a);return ret;}
const int N=1e6+5;
namespace sgt{
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
ll mx[N<<2],add[N<<2];
inline void pushnow(int p,ll v){
add[p]+=v,mx[p]+=v;}
inline void pushdown(int p){
(add[p])&&(pushnow(lc,add[p]),pushnow(rc,add[p]),add[p]=0);}
inline void update(int p,int l,int r,int k,ll v){
if(l==r){
mx[p]=max(mx[p],v);return;}
pushdown(p);
k<=mid?update(lc,l,mid,k,v):update(rc,mid+1,r,k,v);
mx[p]=max(mx[lc],mx[rc]);
}
inline void modify(int p,int l,int r,int ql,int qr,ll v){
if(ql<=l&&r<=qr)return pushnow(p,v);
pushdown(p);
if(qr<=mid)modify(lc,l,mid,ql,qr,v);
else if(ql>mid)modify(rc,mid+1,r,ql,qr,v);
else modify(lc,l,mid,ql,qr,v),modify(rc,mid+1,r,ql,qr,v);
mx[p]=max(mx[lc],mx[rc]);
}
inline ll query(int p,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return mx[p];
pushdown(p);
if(qr<=mid)return query(lc,l,mid,ql,qr);
else if(ql>mid)return query(rc,mid+1,r,ql,qr);
return max(query(lc,l,mid,ql,qr),query(rc,mid+1,r,ql,qr));
}
#undef lc
#undef rc
#undef mid
}
inline void ckmax(ll&a,ll b){
a=a>b?a:b;}
int n,fa[N],dep[N],mxdep[N],hson[N],len[N],L[N],R[N];
ll ans[N];
int pred[N],num[N],tot=0;
vector<pii>e[N];
void dfs1(int p){
mxdep[p]=dep[p];
for(ri i=0,v;i<e[p].size();++i){
dep[v=e[p][i].fi]=dep[p]