【以关注为回报/dk】求助
查看原帖
【以关注为回报/dk】求助
478528
SunXiaoping楼主2021/2/4 18:13
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+5;
inline int read()
{
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
int n,q,a[maxn],sum[maxn<<2],lazy[maxn<<2],ans[maxn],t=1;
inline void pushup(int id)
{
	sum[id]=sum[id<<1]+sum[id<<1|1];
}
inline void pushdown(int id, int l, int r)
{
    if(lazy[id])
    {
        lazy[id<<1]+=lazy[id];
        lazy[id<<1|1]+=lazy[id];
        int mid=(l+r)>>1;
        sum[id<<1]+=lazy[id]*(mid-l+1);
        sum[id<<1|1]+=lazy[id]*(r-mid);
        lazy[id]=0;
    }
}
inline void build(int id,int l,int r)
{
	if(l==r)
	{
		sum[id]+=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	pushup(id);
}
inline void update(int id,int l,int r,int x,int y,int v)
{
    if(x<=l&&r<=y)
    {
        lazy[id]+=v;
        sum[id]+=v*(r-l+1);
        return;
    }
    pushdown(id,l,r);
    int mid=(l+r)>>1;
    if(x<=mid)
    {
        update(id<<1,l,mid,x,y,v);
    }
    if(y>mid)
    {
        update(id<<1|1,mid+1,r,x,y,v);
    }
    pushup(id);
}
inline int query(int id,int l,int r,int x,int y)
{
    if(x<=l&&r<=y)
    {
        return sum[id];
    }
    pushdown(id,l,r);
    int mid=(l+r)>>1;
    int ans=0;
    if(x<=mid)
    {
        ans+=query(id<<1,l,mid,x,y);
    }
    if(y>mid)
    {
        ans+=query(id<<1|1,mid+1,r,x,y);
    }
    return ans;
}
signed main()
{
	n=read();
	q=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	build(1,1,n);
	int op,l,r,k;
	while(q--)
	{
		op=read();
		if(op==1)
		{
			l=read();
			r=read();
			k=read();
			update(1,1,n,l,r,k);
		}
		if(op==2)
		{
			k=read();
			update(1,1,n,l,r,k);
		}
		if(op==3)
		{
			k=read();
			update(1,1,n,l,r,-k);
		}
		if(op==4)
		{
			l=read();
			r=read();
			ans[t++]=query(1,1,n,l,r);
		}
		if(op==5)
		{
			ans[t++]=query(1,1,n,1,1);
		}
	}
	for(int i=1;i<t;i++)
	{
		printf("%d\n",ans[i]);
	}
}
2021/2/4 18:13
加载中...