求助
查看原帖
求助
233394
隐藏人物001楼主2021/8/25 13:45

检查了很久,找不到那里出错了,求助

#include <cstdio>
using namespace std;
struct Node
{
   int l,r;
   long long lazy,sum;
}tree[400010];
int k,k1,m1,i,n,m;
long long s[100010],ans,v;
 void build(int p,int l,int r)
 {
 	tree[p].l=l;
 	tree[p].r=r;
 	tree[p].sum=s[r]-s[l-1];
 	 if (l<r)
 	 {
 	 	int mid=(l+r)>>1;
 	    build(p<<1,l,mid);
		build(p<<1|1,mid+1,r);	
	 }
	 return;
 }
 void treeans(int p)
 {
 	 if ((tree[p].l>=k)&&(tree[p].r<=k1))
 	  {
 	     ans+=tree[p].sum;
		 return;	
	  }
	  if (tree[p].l!=tree[p].r)
	  {
	     tree[p<<1].sum+=(tree[p<<1].r-tree[p<<1].l+1)*tree[p].lazy;
	     tree[p<<1|1].sum+=(tree[p<<1|1].r-tree[p<<1|1].l+1)*tree[p].lazy;
	     tree[p<<1].lazy+=tree[p].lazy;
	     tree[p<<1|1].lazy+=tree[p].lazy;
	     tree[p].lazy=0;
      }
	if ((tree[p].r>k1)&&(tree[p].l>k1)) return;
	if ((tree[p].l<k)&&(tree[p].r<k)) return;
	 treeans(p<<1);
	 treeans(p<<1|1);
 }
 void treeinc(int p)
 {
 	if ((tree[p].l>=k)&&(tree[p].r<=k1))
 	 tree[p].sum+=(tree[p].r-tree[p].l+1)*v,tree[p].lazy+=v;
    if ((tree[p].r>k1)&&(tree[p].l>k1)) return;
	if ((tree[p].l<k)&&(tree[p].r<k)) return;
	treeinc(p<<1);
	treeinc(p<<1|1);
 }
  int main()
  {
  	scanf("%d%d",&n,&m);
  	 for (i=1;i<=n;i++)
  	  {
  	  	 scanf("%d",&s[i]);
  	  	 s[i]+=s[i-1];
      }
      build(1,1,n);
     for (i=1;i<=m;i++)
	 {
	    scanf("%d",&m1);
		if (m1==1)
		 {
		 	scanf("%d%d%d",&k,&k1,&v);
		 	treeinc(1);	
		 }
		if (m1==2)
		{
		  scanf("%d%d",&k,&k1);
		  ans=0;
		  treeans(1);
		  printf("%lld\n",ans);
		}	
	 }
	 return 0; 
  }
2021/8/25 13:45
加载中...