0分求调【玄关】
查看原帖
0分求调【玄关】
1052626
wangrunyang楼主2024/11/19 18:31
#include <bits/stdc++.h>
using namespace std;

#define int long long

int a[100011];

struct stree{
	int l , r , sum , add;
}t[400011];

inline int ls(int x){
	return x << 1;
}

inline int rs(int x){
	return x << 1 | 1;
}

inline int fa(int x){
	return x >> 1;
}

void spread(int p){
	if(t[p].add){
		t[ls(p)].sum += (t[ls(p)].r - t[ls(p)].l + 1) * t[p].add;
		t[ls(p)].add += t[p].add;
		t[rs(p)].sum += (t[rs(p)].r - t[rs(p)].l + 1) * t[p].add;
		t[rs(p)].add += t[p].add;
		t[p].add = 0;
	}
	return ;
}

void bulid(int p , int l , int r){
	t[p].l = l;
	t[p].r = r;
	if(l == r){
		t[p].sum = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	bulid(ls(p) , l , mid);
	bulid(rs(p) , mid + 1 , r);
	t[p].sum = t[ls(p)].sum + t[rs(p)].sum;
	return ;
}

inline int find(int p , int l , int r){
	if(t[p].l >= l && t[p].r <= r){
		return t[p].sum;
	}
//	if(t[p].l < l && t[p].r > r){
//		return 0;
//	}
	spread(p);
	int ret = 0;
	int mid = (t[p].l + t[p].r) >> 1;
	if(l <= mid) ret += find(ls(p) , l , r);
	if(r > mid) ret += find(rs(p) , l , r);
	return ret;
}

void add(int l , int r , int p , int x){
	if(t[p].l >= l && t[p].r <= r){
		t[p].sum += (t[p].r - t[p].l + 1) * x;
		t[p].add += x;
		return ;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) >> 1;
	if(l <= mid) add(ls(p) , l , r , x);
	if(r > mid) add(rs(p) , l , r , x);
	t[p].sum = t[ls(p)].sum + t[rs(p)].sum;
	return ;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	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++){
		int op;
		cin >> op;
		if(op == 1){
			int l , r , _add;
			cin >> l >> r >> _add;
			add(l , r , 1 , _add);
		}
		else{
			int l , r;
			cin >> l >> r;
			cout << find(1 , l , r) << "\n";
		}
//		for(int j = 1;j <= n * 4;j++){
//			cout << j << " " << t[j].sum << " " << t[j].add << " " << t[j].l << " " << t[j].r << "\n";
//		}
//		cout << "\n\n\n";
	}
	return 0;
}
2024/11/19 18:31
加载中...