wa求助
查看原帖
wa求助
65600
masa楼主2021/7/27 10:32

不知道哪里错了

过了一个点 样例点数据错了 写了print

#include<iostream>
using namespace std;
int n,m,a[100010],sum[400040],l[400040],r[400040],add[400040],x,y,k,q;
void make(int p,int le,int ri)
{
	l[p]=le,r[p]=ri;
	if(le==ri)
	{
		sum[p]=a[le];
		return;
	}
	int mid=(ri+le)>>1;
	make(p*2,le,mid);
	make(p*2+1,mid+1,ri);
	sum[p]=sum[p*2]+sum[p*2+1];
}
void print(int p)
{
	cout<<p<<" "<<l[p]<<" "<<r[p]<<" "<<sum[p]<<" "<<add[p]<<endl;
	if(l[p]==r[p])return ;
	print(p*2);
	print(p*2+1);
}
void pud(int p)
{
	if(add[p]!=0)
	{
		int pp=p*2;
		if(r[p]!=l[p])
		{
			add[p*2]+=add[p];
			add[p*2+1]+=add[p];
			sum[pp]+=add[pp]*(r[pp]-l[pp]+1);
			sum[pp+1]+=add[pp+1]*(r[pp+1]-l[pp+1]+1);
		}
		add[p]=0;
	}
}
int search(int p,int le,int ri)
{
	pud(p);
	if(l[p]>=le&&r[p]<=ri)return sum[p];
	int mid=(r[p]+l[p])>>1;
	if(mid<le)return search(p*2+1,le,ri);
	else if(mid>=ri)return search(p*2,le,ri);
	else return search(p*2+1,le,ri)+search(p*2,le,ri);
}
void change(int p,int le,int ri,int d)
{
	if(l[p]>=le&&r[p]<=ri)
	{
		add[p]+=d;
		sum[p]+=d*(r[p]-l[p]+1);
		return;
	}
	pud(p);
	int mid=(r[p]+l[p])>>1;
	if(mid<le)change(p*2+1,le,ri,d);
	else if(mid>=ri)change(p*2,le,ri,d);
	else change(p*2+1,le,ri,d),change(p*2,le,ri,d);
	sum[p]=sum[p*2]+sum[p*2+1];
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	make(1,1,n);
			cout<<endl;
			print(1);
			cout<<endl;
	for(int i=1;i<=m;i++)
	{
		cin>>q>>x>>y;
		if(q==1)
		{
			cin>>k;
			change(1,x,y,k);
			cout<<endl;
			print(1);
			cout<<endl;
		}
		if(q==2)
		{
			cout<<search(1,x,y)<<endl;
		}
	}
}
2021/7/27 10:32
加载中...