玄关求条
查看原帖
玄关求条
753640
封禁用户楼主2024/5/17 16:38

可爱小树剖。

#include<bits/stdc++.h>
#define sd std::
//#define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define il inline
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define f(i,a,b) for(int i=(a);i>=(b);i--)
#define MIN(x,y) (x<y?x:y)
#define MAX(x,y) (x>y?x:y)
#define me(x,y) memset(x,y,sizeof x)
#define pii sd pair<int,int>
#define umap(x,y) sd unordered_map<x,y>
#define pque(x) sd priority_queue<x>
#define X first
#define Y second
#define kg putchar(' ')
#define Fr(a) for(auto it:a)
#define dbg(x) sd cout<<#x<<": "<<x<<sd endl
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
il void print(int x){if(x<0) putchar('-'),printt(-x);else printt(x);}
il void put(int x){print(x);putchar('\n');}
il void printk(int x){print(x);kg;}
const int N=1e5+10,mod=201314;
int n,m;
struct node
{
	int nex;
	int to;
}a[N];
int head[N],tot;
void add(int u,int v)
{
	a[++tot].nex=head[u];
	head[u]=tot;
	a[tot].to=v;
}
int id[N],t,siz[N],son[N],dep[N],top[N],fa[N];
void dfs1(int u)
{
	dep[u]=dep[fa[u]]+1;
	siz[u]=1;
	for(int i=head[u];i;i=a[i].nex)
	{
		int v=a[i].to;
		dfs1(v);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
}
void dfs2(int u)
{
	int v=son[u];
	if(v)
	{
		id[v]=++t;
		top[v]=top[u];
		dfs2(v);
	}
	for(int i=head[u];i;i=a[i].nex)
	{
//		dbg(v);
		int v=a[i].to;
		if(v==son[u]) continue;
		top[v]=v;
		id[v]=++t;
		dfs2(v);
	}
}
#define ls k<<1
#define rs k<<1|1
int s[N<<2],lazy[N<<2];
void pushup(int k){s[k]=(s[ls]+s[rs])%mod;}
void pushdown(int k,int l,int r)
{
	if(!lazy[k]) return;
	int mid=l+r>>1;
	lazy[ls]=(lazy[ls]+lazy[k])%mod;
	lazy[rs]=(lazy[rs]+lazy[k])%mod;
	s[ls]=(s[ls]+(l-mid+1)*lazy[k])%mod;
	s[rs]=(s[rs]+(r-mid)*lazy[k])%mod;
	lazy[k]=0;
}
void update(int k,int l,int r,int x,int y,int v)
{
	if(x<=l&&y>=r)
	{
		s[k]=(s[k]+(r-l+1)*v%mod)%mod;
		lazy[k]=(lazy[k]+v)%mod;
		return;
	}
	pushdown(k,l,r);
	int mid=l+r>>1;
	if(x<=mid) update(ls,l,mid,x,y,v);
	if(y>mid) update(rs,mid+1,r,x,y,v);
	pushup(k);
}
int que(int k,int l,int r,int x,int y)
{
	if(x<=l&&y>=r) return s[k];
	int mid=l+r>>1,res=0;
	if(x<=mid) res=(res+que(ls,l,mid,x,y))%mod;
	if(y>mid) res=(res+que(rs,mid+1,r,x,y))%mod;
	return res;
}
int ask_ch(int u,int v)
{
	int fu=top[u],fv=top[v],ans=0;
	while(fu!=fv)
	{
		if(dep[fu]<dep[fv]) sd swap(u,v),sd swap(fu,fv);
		ans=(ans+que(1,1,n,id[fu],id[u]))%mod;
		u=fa[fu];
		fu=top[u];
	}
	if(dep[u]>dep[v]) sd swap(u,v);
	ans=(ans+que(1,1,n,id[u],id[v]))%mod;
	return ans;
}
void upd_ch(int u,int v)
{
	int fu=top[u],fv=top[v];
	while(fu!=fv)
	{
		if(dep[fu]<dep[fv]) sd swap(u,v),sd swap(fu,fv);
		update(1,1,n,id[fu],id[u],1);
		u=fa[fu];
		fu=top[u];
	}
	if(dep[u]>dep[v]) sd swap(u,v);
	update(1,1,n,id[u],id[v],1);
	return;
}
struct query
{
	int id,x,z;
	bool flag;//类型 
	bool operator <(const query& a)
	{
		return x<a.x;
	}
}q[N];
int c,ans[N];
il void solve()
{
	n=read(),m=read();
	F(i,2,n)
	{
		int x=read()+1;
		add(x,i);
		fa[i]=x;
	}
	F(i,1,m)
	{
		int l=read(),r=read()+1,z=read()+1;
		q[++c]={i,l,z,0};
		q[++c]={i,r,z,1};
	}
	dfs1(1);
	id[1]=++t;top[1]=1;
	dfs2(1);
	sd sort(q+1,q+1+c);
	int now=0;//记录目前添加到了哪个点 
	F(i,1,c)
	{
		while(now<q[i].x)
		{
			upd_ch(1,++now);
		}
		if(q[i].flag) ans[q[i].id]=(ans[q[i].id]+ask_ch(1,q[i].z))%mod;
		else ans[q[i].id]=(ans[q[i].id]-ask_ch(1,q[i].z)+mod)%mod;
	}
	F(i,1,m) put(ans[i]);
}
int main()
{
	int T=1;
//	T=read();
	while(T--) solve();
    return 0;
}
2024/5/17 16:38
加载中...