今天使用dev-c++编译运行如下代码后,程序直接异常退出并返回3221225595
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100009;
int n,m,f[N],dep[N],sz[N],id[N],son[N],top[N];
vector<int> e[N];
int cnt;
void dfs1(int x,int fa,int d){
f[x]=fa,dep[x]=d,sz[x]=1;
for(int i=0;i<e[x].size();i++){
int v=e[x][i];
if(v==fa) continue;
dfs1(v,x,d+1);
sz[x]+=sz[v];
if(sz[e[x][i]]>sz[son[x]]) son[x]=e[x][i];
}
}
void dfs2(int x,int fa){
id[x]=++cnt;
if(x==son[fa]) top[x]=top[fa];
else top[x]=x;
if(!son[x]) return;
dfs2(son[x],x);
for(int i=0;i<e[x].size();i++)if(e[x][i]!=fa&&e[x][i]!=son[x]) dfs2(e[x][i],x);
}
int bl,x[N],a[N],b[N],bs[N],c[N],bsz[N];
void init(){
bl=sqrt(n);
int cntb=1;
for(int i=1;i<=n;i++){
b[i]=cntb,bsz[b[i]]++;
if(i%bl==0) cntb++;
}
for(int i=1;i<cntb;i++) c[i]=2;
for(int i=1;i<=n;i++) bs[b[i]]+=1;
}
void push_down(int x){
if(c[x]==2) return;
int l=bl*(x-1)+1;
for(int i=l;i<=l+bsz[i]-1;i++) a[i]=c[x];
c[x]=2;
}
void upd(int l,int r,int k){
push_down(b[l]);
push_down(b[r]);
if(b[l]==b[r]){
for(int i=l;i<=r;i++) bs[b[i]]+=(k-a[i]),a[i]=k;
return;
}
for(int i=l;b[i]==b[l];i++) bs[b[i]]+=(k-a[i]),a[i]=k;
for(int i=r;b[i]==b[r];i--) bs[b[i]]+=(k-a[i]),a[i]=k;
for(int i=b[l]+1;i<=b[r]-1;i++){
c[i]=k;
bs[i]=k*bsz[i];
}
}
int query(int l,int r){
push_down(b[l]);
push_down(b[r]);
int ans=0;
if(b[l]==b[r]){
for(int i=l;i<=r;i++) ans+=a[i];
return ans;
}
for(int i=l;b[i]==b[l];i++) ans+=a[i];
for(int i=r;b[i]==b[r];i--) ans+=a[i];
for(int i=b[l]+1;i<=b[r]-1;i++) ans+=bs[i];
return ans;
}
int querypath(int u,int v){
int ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ans+=query(id[top[u]],id[u]);
upd(id[top[u]],id[u],0);
u=f[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
ans+=query(id[u],id[v]);
upd(id[u],id[v],0);
return ans;
}
int queryson(int u){
int ans=sz[u]-query(id[u],id[u]+sz[u]-1);
upd(id[u],id[u]+sz[u]-1,1);
return ans;
}
signed main(){
cin>>n>>m;
for(int i=2;i<=n;i++){
int u;
cin>>u;
e[i].push_back(u+1);
e[u+1].push_back(i);
}
dfs1(1,1,0);
dfs2(1,0);
init();
while(m--){
int op,x;
cin>>op>>x;
x++;
if(op==1) cout<<querypath(1,x)<<endl;
if(op==2) cout<<queryson(x)<<endl;
}
return 0;
}
关键是,我把主函数内内容全部注释掉之后,程序依然是异常退出了,放到在线IDE里面结果也是差不多,这是啥情况啊