蒟蒻线段树求助
查看原帖
蒟蒻线段树求助
108610
Dzhao楼主2020/8/23 14:38

不知道为什么全都WA掉了,十分神奇

#include<bits/stdc++.h>
using namespace std;
namespace IO
{
	int slen=0;char c,buf[22];bool f;
	template <typename T>
	inline void rd(T &x)
	{
		x=0;f=0;c=getchar();
		while(!isdigit(c)) {if(c=='-') f=1;c=getchar();}
		while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
		if(f) x=-x;
	}
	template <typename T>
	inline void wt(T x)
	{
		if(!x) putchar('0');if(x<0) putchar('-'),x=-x;
		while(x) buf[++slen]=x%10+48,x/=10;
		while(slen) putchar(buf[slen--]);
	}
}
using IO::rd;
using IO::wt;
const int N=100005,M=200005;
typedef long long ll;
int n,m,ver[M],nxt[M],h[N],fl[M],tot,ind,tid[N],tif[N],val[M];
ll a[N],tr[M<<2],tag[M<<2],sum[M];
inline void add(int x,int y) {ver[++tot]=y,nxt[tot]=h[x],h[x]=tot;}
void dfs(int u,int fa)
{
	tid[u]=++ind;
	val[ind]=a[u];
	fl[ind]=1;
	for(int i=h[u];i;i=nxt[i])
		if(ver[i]!=fa) dfs(ver[i],u);
	tif[u]=++ind;
	val[ind]=-a[u];
	fl[ind]=-1;
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		tr[p]=val[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	tr[p]=tr[p<<1]+tr[p<<1|1];
}
inline void push_down(int p,int l,int mid,int r)
{
	if(tag[p])
	{
		tr[p<<1]+=tag[p]*(sum[mid]-sum[l-1]);
		tr[p<<1|1]+=tag[p]*(sum[r]-sum[mid]);
		tag[p<<1]+=tag[p];
		tag[p<<1|1]+=tag[p];
		tag[p]=0; 
	}
}
void modify(int p,int l,int r,int x,int y,ll z) 
{
	if(l>=x && r<=y) 
	{
		tr[p]+=z*(sum[r]-sum[l-1]);
		tag[p]+=z;
		return;
	}
	int mid=(l+r)>>1;
	push_down(p,l,mid,r);
	if(mid>=x) modify(p<<1,l,mid,x,y,z);
	if(mid<y) modify(p<<1|1,mid+1,r,x,y,z);
	tr[p]=tr[p<<1]+tr[p<<1|1];
}
ll query(int p,int l,int r,int x,int y) 
{
	if(l>=x && r<=y) return tr[p];
	int mid=(l+r)>>1;ll res=0;
	push_down(p,l,mid,r);
	if(mid>=x) res+=query(p<<1,l,mid,x,y);
	if(mid<y) res+=query(p<<1|1,mid+1,r,x,y);
	return res;
}

int main()
{
	rd(n),rd(m);
	for(int i=1;i<=n;i++) rd(a[i]);
	for(int i=1,x,y;i<n;i++)
	{
		rd(x),rd(y);
		add(x,y),add(y,x);
	}
	dfs(1,0);
	for(int i=1;i<=2*n;i++) 
		sum[i]=sum[i-1]+fl[i];
	build(1,1,2*n);
	while(m--)
	{
		int op,x,z;
		rd(op);
		if(op==1)
		{
			rd(x),rd(z);
			modify(1,1,2*n,tid[x],tid[x],z);
			modify(1,1,2*n,tif[x],tif[x],-z);
		}
		else if(op==2)
		{
			rd(x),rd(z);
			modify(1,1,2*n,tid[x],tif[x],z);
		}
		else 
		{
			rd(x);
			wt(query(1,1,2*n,1,tid[x])),putchar('\n');
		}
	}
	return 0;
}
2020/8/23 14:38
加载中...