萌新刚学OI 阳历错误求调
查看原帖
萌新刚学OI 阳历错误求调
766022
__pipi__楼主2024/8/9 13:46

rtrt

#include <bits/stdc++.h>
#define ll long long
#define l(x) (x<<1)
#define r(x) (x<<1|1)
#define bar(x,y) (x+y>>1)
using namespace std;
const int N=1e5+5;
const int inf=1e9;
ll n,m,arr[N];

struct stu {
	ll le,ri,val,add;
}tree[N];

void ee(ll p) {
	if(tree[p].add) {
		tree[l(p)].val+=tree[p].add*(tree[l(p)].ri-tree[l(p)].le+1);
		tree[r(p)].val+=tree[p].add*(tree[r(p)].ri-tree[r(p)].le+1);
		tree[l(p)].add+=tree[p].add;
		tree[r(p)].add+=tree[p].add;
		tree[p].add=0;
	}
}
void upd(ll p) {
	tree[p].val=tree[l(p)].val+tree[r(p)].val;
}

void bui(ll p,ll le,ll ri) {
	tree[p].le=le;
	tree[p].ri=ri;
	tree[p].add=0;
	if(le==ri) {
		tree[p].val=arr[le];
		return ;
	}
	ll mid=bar(le,ri);
	bui(l(p),le,mid);
	bui(r(p),mid+1,ri);
	upd(p);
}

void add(ll p,ll le,ll ri,ll x) {
	if(le<=tree[p].le&&tree[p].ri<=ri) {
		tree[p].val+=x*(tree[p].ri-tree[p].le+1);
		tree[p].add+=x;
		return ;
	}
	ee(p);
	ll mid=bar(tree[p].le,tree[p].ri);
	if(le<=mid) return add(l(p),le,ri,x);
	if(mid<=ri) return add(r(p),le,ri,x);
	upd(p);
}

ll ask(ll p,ll le,ll ri) {
	if(le<=tree[p].le&&tree[p].ri<=ri) return tree[p].val;
	ee(p);
	ll mid=bar(tree[p].le,tree[p].ri),sum=0;
	if(le<=mid) sum+=ask(l(p),le,ri);
	if(ri>mid) sum+=ask(r(p),le,ri);
	return sum;
}
int main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		cin>>arr[i];
	}
	bui(1,1,n);
	while(m--) {
		ll t;
		cin>>t;
		if(t==1) {
			ll x,y,k;
			cin>>x>>y>>k;
			add(1,x,y,k);
		}
		else {
			ll x,y;
			cin>>x>>y;
			cout<<ask(1,x,y)<<endl;
		}
	}
	return 0;
}
2024/8/9 13:46
加载中...