我的代码在luogu上过了,但是在老师的oj上完全一样的题一直显示segmentation fault,我真的麻了,后来我把所有东西都暴力开longlong后竟然显示bus error??
广大的谷友们求求了帮我看一眼我的代码有没有什么小漏洞吧,疯了
#include<bits/stdc++.h>
#define lson pos<<1
#define rson pos<<1|1
using namespace std;
const int N=1e5+10;
long long n,tot,cnt,q;
long long head[N],nxt[N*2],to[N*2];
long long fa[N],deep[N],sz[N],son[N];
long long id[N],top[N];
long long tree[N*4],lazy[N*4];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs1(int x,int f)
{
deep[x]=deep[f]+1;
fa[x]=f;
sz[x]=1;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(y==f)
continue;
dfs1(y,x);
sz[x]+=sz[y];
if(!son[x]||sz[son[x]]<sz[y])
son[x]=y;
}
}
void dfs2(int x,int t)
{
id[x]=++cnt;
top[x]=t;
if(!son[x])
return;
dfs2(son[x],t);
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(y==fa[x]||y==son[x])
continue;
dfs2(y,y);
}
}
void pushdown(int pos,int l,int r)
{
int mid=(l+r)>>1;
tree[lson]+=(mid-l+1)*lazy[pos];
lazy[lson]+=lazy[pos];
tree[rson]+=(r-mid)*lazy[pos];
lazy[rson]+=lazy[pos];
lazy[pos]=0;
}
void update(int pos,int l,int r,int x,int y,int k)
{
int mid=(l+r)>>1;
if(x<=l&&r<=y)
{
tree[pos]+=(r-l+1)*k;
lazy[pos]+=k;
return;
}
pushdown(pos,l,r);
if(x<=mid)
update(lson,l,mid,x,y,k);
if(y>mid)
update(rson,mid+1,r,x,y,k);
tree[pos]=tree[lson]+tree[rson];
}
void upd_chain(int x,int y,int k)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]])
swap(x,y);
update(1,1,n,id[top[x]],id[x],k);
x=fa[top[x]];
}
if(deep[x]<deep[y])
swap(x,y);
update(1,1,n,id[y],id[x],k);
}
long long query(int pos,int l,int r,int x,int y)
{
long long ret=0;
int mid=(l+r)>>1;
if(x<=l && r<=y)
return tree[pos];
pushdown(pos,l,r);
if(x<=mid)
ret+=query(lson,l,mid,x,y);
if(y>mid)
ret+=query(rson,mid+1,r,x,y);
return ret;
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<n;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
x++,y++;
add(x,y);
add(y,x);
}
dfs1(1,0);
dfs2(1,1);
scanf("%lld",&q);
while(q--)
{
char c;
cin>>c;
if(c=='A')
{
long long x,y,d;
scanf("%lld%lld%lld",&x,&y,&d);
x++,y++;
upd_chain(x,y,d);
}
else
{
long long x;
scanf("%lld",&x);
printf("%lld\n",query(1,1,n,id[x+1],id[x+1]+sz[x+1]-1));
}
}
return 0;
}