线段树模板题,真的找不到错误哇~~~
查看原帖
线段树模板题,真的找不到错误哇~~~
85897
若素楼主2021/7/29 15:39
#include<bits/stdc++.h>
using namespace std;
#define RI register int
#define LL long long
const int N=1e5+5;
int n,m;
LL a[N];
struct Node{
	int l,r;
	LL sum,lazy;
}tree[N<<2];
inline int ls(int x){
	return x<<1;
}
inline int rs(int x){
	return x<<1|1;
}
inline int gs(int x){
	return x>>1;
}
void updatesum(int x){
	tree[x].sum=tree[ls(x)].sum+tree[rs(x)].sum;
}
void build(int l,int r,int x){
	tree[x].l=l;tree[x].r=r;
	if(l==r){
		tree[x].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls(x));build(mid+1,r,rs(x));
	updatesum(x);
}
void updaterange(int l,int r,LL k,int x){
	if(tree[x].l==l&&r==tree[x].r){
		tree[x].sum+=k*(r-l+1);tree[x].lazy+=k;
		return;
	}
	if(r<=tree[ls(x)].r) updaterange(l,r,k,ls(x));
	else if(l>=tree[rs(x)].l) updaterange(l,r,k,rs(x));
	else{
		updaterange(l,tree[ls(x)].r,k,ls(x));updaterange(tree[rs(x)].l,r,k,rs(x));
	}
	updatesum(x);
}
void f(int x){
	tree[x].sum+=(tree[x].r-tree[x].l+1)*tree[gs(x)].lazy;
	tree[x].lazy+=tree[gs(x)].lazy;
}
void pushdown(int x){
	if(tree[x].l==tree[x].r){
		tree[x].lazy=0;
		return;
	}
	f(ls(x));f(rs(x));
	tree[x].lazy=0;
}
LL query(int l,int r,int x){
	if(tree[x].l==l&&r==tree[x].r) return tree[x].sum;
	if(tree[x].lazy) pushdown(x);
	if(r<=tree[ls(x)].r) return query(l,r,ls(x));
	if(l>=tree[rs(x)].l) return query(l,r,rs(x));
	return query(l,tree[ls(x)].r,ls(x))+query(tree[rs(x)].l,r,rs(x));
}
int main(){
	//freopen("P3372_2.in","r",stdin);
	//freopen("000.out","w",stdout);
	int e,l,r;
	LL k;
	scanf("%d%d",&n,&m);
	for(RI i=1;i<=n;++i) scanf("%lld",&a[i]);
	build(1,n,1);
	for(RI i=1;i<=m;++i){
		scanf("%d%d%d",&e,&l,&r);
		if(e==1){
			scanf("%lld",&k);
			updaterange(l,r,k,1);
		}
		else printf("%lld\n",query(l,r,1));
	}
	return 0;
}
2021/7/29 15:39
加载中...