线段树求条玄关
  • 板块灌水区
  • 楼主a6b6c6d6
  • 当前回复18
  • 已保存回复18
  • 发布时间2025/2/3 12:18
  • 上次更新2025/2/3 18:23:18
查看原帖
线段树求条玄关
1354472
a6b6c6d6楼主2025/2/3 12:18
#include<bits/stdc++.h>
using namespace std;
int n,m,f,x,y,k,a[100001];
struct node{
	int l,r;
	int s,tag;
}tree[400006];
void build(long long x,long long l,long long r){
	tree[x].l=l;
	tree[x].r=r;
	if(l==r){
		tree[x].s=a[l];
	}else{
		int mid=(l+r)>>1;
		build(x*2,l,mid);
		build(x*2+1,mid+1,r);
		tree[x].s=tree[x*2].s+tree[x*2+1].s;
	}
}
long long query(long long x,long long l,long long r,long long ql,long long qr){
	if(l==ql&&r==qr)return tree[x].s+(r-l+1)*tree[x].tag;
	int mid=(l+r)>>1; 
	if(qr<=mid)return query(x*2,l,mid,ql,qr);
	else if(ql>mid)return query(x*2+1,mid+1,r,ql,qr);
	else return query(x*2,l,mid,ql,mid)+query(x*2+1,mid+1,r,mid+1,qr);
}
void push_down(long long x,long long l,long long r,long long ql,long long qr,long long k){
	if(l==ql&&r==qr){
		tree[x].tag+=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(qr<=mid)push_down(x*2,l,mid,ql,qr,k);
	else if(ql>mid)push_down(x*2+1,mid+1,r,ql,qr,k);
	else{
		push_down(x*2,l,mid,ql,mid,k);
		push_down(x*2+1,mid+1,r,mid+1,qr,k);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&f,&x,&y);
		if(f==1){
			scanf("%d",&k);
			push_down(1,1,n,x,y,k);
		}else{
			printf("%d\n",query(1,1,n,x,y));
		}
	}
	return 0;
}
2025/2/3 12:18
加载中...