题目大意:n个节点有根树,有q次询问,每次询问给出l r z,求
∑l<=i<=rdep[LCA(i,z)]
题解:Orz
我的收获:2333
#include <bits/stdc++.h>
using namespace std;
#define P 201314
#define N 50005
int n,m,cnt;
int ans[N];
vector<int> E[N];
struct qus{int p,id,flag,lca;}a[N<<1];
bool operator <(qus x,qus y){return x.p<y.p;}
struct SegmentTree{
#define ls x<<1
#define rs x<<1|1
#define lson l,mid,x<<1
#define rson mid+1,r,x<<1|1
#define root 1,n,1
int sum[N<<2],add[N<<2];
void pushup(int x){sum[x]=sum[ls]+sum[rs];}
void pushdown(int x,int len)
{
if(!add[x]||len==1) return ;
add[ls]+=add[x],add[rs]+=add[x];
sum[ls]+=add[x]*(len-(len>>1));
sum[rs]+=add[x]*(len>>1);
add[x]=0;
}
void updata(int L,int R,int v,int l,int r,int x)
{
if(L<=l&&r<=R){add[x]+=v;sum[x]+=v*(r-l+1);return ;}
pushdown(x,r-l+1);
int mid=(l+r)>>1;
if(L<=mid) updata(L,R,v,lson);
if(R>mid) updata(L,R,v,rson);
pushup(x);
}
int query(int L,int R,int l,int r,int x)
{
if(L<=l&&r<=R) return sum[x];
pushdown(x,r-l+1);
int mid=(l+r)>>1,ret=0;
if(L<=mid) ret+=query(L,R,lson);
if(R>mid) ret+=query(L,R,rson);
return ret;
}
}T;
namespace HeavyLightChainPoufen{
int sz[N],dep[N],fa[N],son[N];
int tim,top[N],dfn[N];
void predfs(int x)
{
sz[x]=1;
for(int i=0;i<E[x].size();i++){
int v=E[x][i];
if(v!=fa[x]){
fa[v]=x,dep[v]=dep[x]+1;
predfs(v);sz[x]+=sz[v];
if(sz[v]>sz[son[x]]) son[x]=v;
}
}
}
void dfs(int x,int tp)
{
top[x]=tp;dfn[x]=++tim;
if(son[x]) dfs(son[x],tp);
for(int i=0;i<E[x].size();i++){
int v=E[x][i];
if(v!=son[x]&&v!=fa[x]) dfs(v,v);
}
}
void add(int x)
{
while(top[x]!=top[1])
T.updata(dfn[top[x]],dfn[x],1,root),x=fa[top[x]];
T.updata(dfn[1],dfn[x],1,root);
}
int ask(int x)
{
int sum=0;
while(top[x]!=top[1])
sum+=T.query(dfn[top[x]],dfn[x],root),sum%=P,x=fa[top[x]];
sum+=T.query(dfn[1],dfn[x],root);sum%=P;
return sum;
}
}
void work()
{
int now=1;
for(int i=1;i<=cnt;i++){
while(now<=n&&now<=a[i].p) HeavyLightChainPoufen::add(now++);
ans[a[i].id]+=a[i].flag*HeavyLightChainPoufen::ask(a[i].lca)+P;
ans[a[i].id]%=P;
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
}
void init()
{
scanf("%d%d",&n,&m);
for(int x,i=2;i<=n;i++) scanf("%d",&x),E[x+1].push_back(i);
HeavyLightChainPoufen::predfs(1);HeavyLightChainPoufen::dfs(1,1);
for(int l,r,z,i=1;i<=m;i++){
scanf("%d%d%d",&l,&r,&z);l++;r++;z++;
a[++cnt].p=l-1;a[cnt].id=i;a[cnt].flag=-1;a[cnt].lca=z;
a[++cnt].p=r;a[cnt].id=i;a[cnt].flag=1;a[cnt].lca=z;
}
sort(a+1,a+cnt+1);
}
int main()
{
init();
work();
return 0;
}