0pts全RE
查看原帖
0pts全RE
993044
Like_Amao楼主2025/8/4 19:26
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],f[N*4],tag[N*4];
void build(int,int,int);
void add(int,int,int,int,int,int);
void push_down(int,int,int);
int ask(int,int,int,int,int);
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int opt,x,y;
		cin>>opt>>x>>y;
		if(opt==1)
		{
			int c;
			cin>>c;
			add(1,1,n,x,y,c);
		}
		else
		{
			cout<<ask(1,1,n,x,y)<<endl;
		}
	}
	return 0;
}
void build(int i,int left,int right)
{
	if(left==right)
	{
		f[i]=a[left];
		return;
	}
	int middle=(left+right)>>1;
	build(i+i,left,middle);
	build(i+i+1,middle+1,right);
	f[i]=f[i+i]+f[i+i+1];
}
void add(int i,int left,int right,int u,int v,int c)
{
	if(left==u and right==v)
	{
		f[i]+=(right-left)*c;
		tag[i]+=c;
		return;
	}
	int middle=(left+right)>>1;
	push_down(i,left,right);
	if(u<=middle)
	{
		add(i+i,left,middle,u,v,c);
	}
	if(v>=middle+1)
	{
		add(i+i+1,middle+1,right,u,v,c);
	}
	f[i]=f[i+i]+f[i+i+1];
}
void push_down(int i,int left,int right)
{
	int middle=(left+right)>>1;
	tag[i+i]+=tag[i];
	f[i+i]+=tag[i]*(middle-left+1);
	tag[i+i+1]+=tag[i];
	f[i+i+1]+=tag[i]*(right-middle);
	tag[i]=0;
}
int ask(int i,int left,int right,int u,int v)
{
	if(left==u and right==v)
	{
		return f[i];
	}
	int middle=(left+right)>>1;
	push_down(i,left,right);
	if(v<=middle)
	{
		return ask(i+i,left,middle,u,v);
	}
	if(u>=middle+1)
	{
		return ask(i+i+1,middle+1,right,u,v);
	}
	return ask(i+i,left,middle,u,middle)+ask(i+i+1,middle+1,right,middle+1,v);
}
2025/8/4 19:26
加载中...