求助【哭】
查看原帖
求助【哭】
358763
江宁12345678楼主2023/3/28 21:52
#include<bits/stdc++.h>
using namespace std;
const int maxx=111111;
long long n,m,a[111111];
struct tree
{
   int l,r;
   long long pre,add;
};
tree t[4*maxx+2];
void bt(long long p,long long l,long long r)
{
   t[p].l=l;
   t[p].r=r;
   if(l==r)
   {
   	t[p].pre=a[l];
   	return;
   }
   long long mid=(l+r)/2;
   bt(p*2,1,mid);
   bt(p*2+1,mid+1,r);
   t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
void bjxc(long long p)
{
   if(t[p].add!=0)
   {
   	t[p*2].pre+=t[p].add*(t[p*2].r-t[p*2].l+1);
   	t[p*2+1].pre+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
   	t[p*2].add+=t[p].add;
   	t[p*2+1].add+=t[p].add;
   	t[p].add=0; 
   }
}
void qjxg(long long p,long long x,long long y,long long z)
{
   if(x<=t[p].l&&y>=t[p].r)
   {
   	t[p].pre+=(long long)z*(t[p].r-t[p].l+1);
   	t[p].add+=z;
   	return;
   }
   bjxc(p);
   long long mid=(t[p].l+t[p].r)/2;
   if(x<=mid)
   {
   	qjxg(p*2,x,y,z);
   }
   if(y>mid)
   {
   	qjxg(p*2+1,x,y,z);		
   }
   t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
long long ask(long long p,long long x,long long y)
{
   if(x<=t[p].l&&y>=t[p].r) 
   {
   	return t[p].pre;
   }
   bjxc(p);
   long long mid=(t[p].l+t[p].r)/2;
   long long sum=0;
   if(x<=mid) 
   {
   	sum+=ask(p*2,x,y);
   }
   if(y>mid) 
   {
   	sum+=ask(p*2+1,x,y);
   }
   return sum;
}
int main()
{
   cin>>n>>m;
   for(int i=1;i<=n;i++)
   {
   	cin>>a[i];
   }
   bt(1,1,n);
   for(int i=1;i<=m;i++)
   {
   	long long cz;
   	cin>>cz;
   	if(cz==1)
   	{
   		long long x,y,k;
   		cin>>x>>y>>k;
   		qjxg(1,x,y,k);
   	}
   	if(cz==2)
   	{
   		long long x,y;
   		cin>>x>>y;
   		cout<<ask(1,x,y)<<endl;
   	}
   }
   return 0;
}

救命!!!

2023/3/28 21:52
加载中...