蒟蒻刚回归OI0.1天,消毒水求调❤
查看原帖
蒟蒻刚回归OI0.1天,消毒水求调❤
992743
HS_xh楼主2023/10/24 20:27

rt,RE三个

#include<bits/stdc++.h>
using namespace std;
const long long maxn=1e5;
int a[5*maxn+2];
struct tree
{
	int l,r;
	long long pre,add;
}t[6*maxn+2];
void bulid(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	if(l==r) 
	{
		t[p].pre=a[l];
		return;
	}
	int mid=l+r>>1;
	bulid(p*2,l,mid);
	bulid(p*2+1,mid+1,r);
	t[p].pre=t[p*2].pre+t[p*2+1].pre;
}
void change(int p,int x,int y,int z)
{
	if(x<=t[p].l && y>=t[p].r)
	{
		t[p].pre+=(long long)z*(t[p].r-t[p].l+1);
		return;
	}
	int mid=t[p].l+t[p].r>>1;
	if(x<=mid) change(p*2,x,y,z);
	if(y>mid) change(p*2+1,x,y,z);
	t[p].pre=t[p*2].pre+t[p*2+1].pre;
} 
long long find(int p,int x,int y)
{
	if(x<=t[p].l && y>=t[p].r) return t[p].pre;
	int mid=t[p].l+t[p].r>>1;
	long long ans=0;
	if(x<=mid) ans+=find(p*2,x,y);
	if(y>mid) ans+=find(p*2+1,x,y);
	return ans;
} 
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;++i)
	cin>>a[i];	
	bulid(1,1,n);
	for(int i=1;i<=m;++i)
	{
		string q;
		long long x,y,z;
		cin>>q;
		if(q=="1") 
		{
			cin>>x>>y;
			change(1,x,x,y);
		}
		else 
		{
			cin>>x>>y;
			cout<<find(1,x,y)<<endl;
		}
	}
}

2023/10/24 20:27
加载中...