线段树10分求助
查看原帖
线段树10分求助
458493
__BAI__楼主2023/1/12 21:48
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int lazy[400005],tree[400005],n,a[100005],m,x,y,k,z;
void built(int d,int l,int r){
	if(l>=r)return;
	if(l==r-1){tree[d]=a[l];return;}
	int mid=(l+r)/2;
	int l_kid=d*2;
	int r_kid=d*2+1;
	built(l_kid,l,mid);
	built(r_kid,mid,r);
	tree[d]=tree[l_kid]+tree[r_kid];
}
void f(int d,int l,int r,int v){
	lazy[d]+=v;
	tree[d]+=v*(r-l); 
}
void add(int d,int l,int r,int p,int q,int v){
	if(p==l and q==r){f(d,l,r,v);return;}
	int mid=(l+r)/2;
	int l_kid=d*2;
	int r_kid=d*2+1;
	if(p>=mid)add(r_kid,mid,r,p,q,v);
	else if(q<=mid)add(l_kid,l,mid,p,q,v);
	else{
		add(l_kid,l,mid,p,mid,v);
		add(r_kid,mid,r,mid,q,v);
	}
	tree[d]=tree[l_kid]+tree[r_kid];
}
int get(int d,int l,int r,int p,int q){
	if(l==p and r==q){return tree[d];}
	int mid=(l+r)/2;
	int l_kid=d*2;
	int r_kid=d*2+1;
	if(lazy[d]){f(l_kid,l,mid,lazy[d]);f(r_kid,mid,r,lazy[d]);lazy[d]=0;}
	if(p>=mid)return get(r_kid,mid,r,p,q);
	if(q<=mid)return get(l_kid,l,mid,p,q);
	return get(l_kid,l,mid,p,mid)+get(r_kid,mid,r,mid,q);
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	built(1,1,n+1);
	while(m--){
		z=read();
		if(z==1){
			x=read(),y=read(),k=read();
			add(1,1,n+1,x,y+1,k);
		}else{
			x=read(),y=read();
			printf("%d\n",get(1,1,n+1,x,y+1));
		}
	}
} 
2023/1/12 21:48
加载中...