求助!!!编译错误啊,是为啥啊
查看原帖
求助!!!编译错误啊,是为啥啊
832745
yojawe楼主2023/4/27 17:56
#include<stdio.h>
#include<iostream>
//#include<vector>

//typedef pair<int,int> PII;
const int N=50010,MAX=201314;
int next[N]={0},fa[N]={0},d[N]={0},vis[N]={0};
int ver[N]={0},Next[N]={0},head[N]={0},edges[N]={0};
int tree[N][N]={0};
int tmp[N][3]={0},temp[N][3]={0};
//vector<map<int,int> > query(N);
int n,m,a,b,c,tot=0;
int lowbit(int x){
	return x&-x;
}
void Tadd(int now,int x,int data){
	for(int i=x;i<=n;i+=lowbit(i)){
		tree[now][i]+=data;
	}
	return;
}
int query(int now,int x){
	int sum=0;
	for(int i=x;i>0;i-=lowbit(i)){
		sum+=tree[now][i];
	}
	return sum;
}
void add(int x,int y,int z){
	ver[++tot]=y,edges[tot]=z,Next[tot]=head[x],head[x]=tot;
	return;
}

int find(int x){
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}
void tarjan(int x){
	vis[x]=1;
	for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(vis[y]) continue;
		d[y]=(d[x]+edges[i])%MAX;
		//cout<<y<<" "<<d[y]<<endl;
		tarjan(y);
		fa[y]=x;
	}
	for(int i=tmp[x][0];i<=tmp[x][1]&&i;i++){
		int y=i;
		if(vis[y]==2){
			int lca=find(y);
			Tadd(x,y,d[lca]);
			Tadd(y,x,d[lca]);
		}
	}
	vis[x]=2;
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	d[1]=1;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=2;i<=n;i++){
		scanf("%d",&c);
		//fa[i]=c+1;
		add(c+1,i,1),add(i,c+1,1);
	}
	fa[1]=1;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a,&b,&c);
		a++,b++,c++;
		temp[i][0]=a,temp[i][1]=b,temp[i][2]=c;
		if(tmp[c][0]==0){
			tmp[c][0]=a;
			tmp[c][1]=b;
		}else{
			tmp[c][0]=std::min(a,tmp[c][0]);
			tmp[c][1]=std::min(b,tmp[c][1]);
		}
	}
	tarjan(1);
	for(int i=1;i<=m;i++){
		int sum=(query(temp[i][2],temp[i][1])-query(temp[i][2],temp[i][0]-1))%MAX;
		if(temp[i][1]>=temp[i][2]&&temp[i][2]>=temp[i][0]) sum=(sum+d[temp[i][2]])%MAX; 		
		printf("%d\n",sum);
	}
	return 0;
}
2023/4/27 17:56
加载中...