0ptsRE 求调
查看原帖
0ptsRE 求调
937850
yudongkai1234楼主2024/7/14 08:35

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int ans[N*4],p[N*4],lazy[N*4];
int n,m;
inline int ls(int x)
{
	return x << 1;
}
inline int rs(int x)
{
	return x << 1 | 1;
}
inline int push_up(int x)
{
	ans[x] =  (ans[ls(x)] + ans[rs(x)]);
}
inline void build(int k,int l,int r)
{
	if(l == r){ans[k] = p[l]; return ;}
	int mid = l + r >> 1;
	build(ls(k),l,mid);
	build(rs(k),mid + 1,r);
	push_up(k);
}
inline void f(int k,int l,int r,int s)
{
	ans[k] += (r - l + 1) * s;
	lazy[k] += s;
}
inline void push_down(int l,int r,int k)
{
	int mid = l + r >> 1;
	f(ls(k),l,mid,lazy[k]);
	f(rs(k),mid + 1,r,lazy[k]);
	lazy[k] = 0;
}
inline void update(int nl,int nr,int l,int r,int k,int s)
{
	if(nl <= l && nr >= r) 
	{
		ans[k] += (r - l + 1) * s;
		lazy[k] += s;
		return ;
	}
	int mid = l + r >> 1;
	push_down(l,r,k);
	if(mid >= nl) update(nl,nr,l,mid,ls(k),s);
	if(mid < nr) update(nl,nr,mid + 1,r,rs(k),s);
	push_up(k);
}
inline int query(int q_l,int q_r,int l,int r,int k)
{
	if(q_l <= l && q_r >= r) return ans[k];
	int res = 0,mid = l + r >> 1;
	push_down(l,r,k);
	if(mid >= q_l) res += query(q_l,q_r,l,mid,ls(k));
	if(mid < q_r) res += query(q_l,q_r,mid + 1,r,rs(k));
	return res;
}
signed main(){
	ios::sync_with_stdio(0); 
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> p[i];
	build(1,1,n);
	for(int i = 1; i <= m; i ++)
	{
		int op; cin >> op;
		if(op == 1)
		{
			int x, y, k;
			cin >> x >> y >> k;
			update(x,y,1,n,1,k);
		}
		if(op == 2)
		{
			int x, y;
			cin >> x >> y;
			int sum = query(x,y,1,n,1);
			cout << sum <<'\n';
		}
	}
	
} 
2024/7/14 08:35
加载中...