RE 求调
查看原帖
RE 求调
741244
Eason_cyx大愚若智楼主2024/6/22 16:19
#include <bits/stdc++.h>
using namespace std;
struct seg {
	int l,r,x;
} tree[800005];
int a[100005],tag[100005];
int ls(int x) {return x << 1;}
int rs(int x) {return x << 1 | 1;}
void pushup(int x) {
	tree[x].x = tree[ls(x)].x + tree[rs(x)].x;
}
void build(int x,int l,int r) {
	tag[x] = 0;
	if(l == r) {
		tree[x].x = a[l];
		return ;
	}
	int mid = (l+r) >> 1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
}
void addtag(int x,int l,int r,int k) {
	tree[x].x += (r-l+1) * k;
	tag[x] += k;
}
void pushdown(int x,int l,int r) {
	int mid = (l+r) >> 1;
	addtag(ls(x),l,mid,tag[x]);
	addtag(rs(x),mid+1,r,tag[x]);
	tag[x] = 0;
}
void update(int nl,int nr,int x,int l,int r,int k) {
	//nlnr 是需要更新的
	if(nl <= l && r <= nr) {
		tag[x] += k;
		tree[x].x += k * (r-l+1);
		return ;
	}
	pushdown(x,l,r);
	int mid = (l+r) >> 1;
	if(nl <= mid) update(nl,nr,ls(x),l,mid,k);
	if(mid+1 <= nr) update(nl,nr,rs(x),mid+1,r,k);
}
int query(int ql,int qr,int x,int l,int r) {
	int ans = 0;
	if(ql <= l && r <= qr) {
		return tree[x].x;
	}
	int mid = (l+r) >> 1;
	pushdown(x,l,r);
	if(ql <= mid) ans += query(ql,qr,ls(x),l,mid);
	if(qr > mid) ans += query(ql,qr,rs(x),mid+1,r);
	return ans;
}
int main() {
	int n,m; cin >> n >> m;
	for(int i = 1;i <= n;i++) cin >> a[i];
	build(1,1,n);
	while(m--) {
		int opt; cin >> opt;
		if(opt == 1) {
			int l,r,x; cin >> l >> r >> x;
			// update(1,1,n,l,r,x);	
		}
		else {
			int x,y; cin >> x >> y;
			cout << query(1,1,n,x,y) << endl;
		}
	}
	return 0;
}
2024/6/22 16:19
加载中...