50pts求调
  • 板块P1531 I Hate It
  • 楼主Lemon_zqp
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/5/20 11:15
  • 上次更新2024/5/20 17:16:53
查看原帖
50pts求调
551630
Lemon_zqp楼主2024/5/20 11:15
#include<bits/stdc++.h>
#define int long long
using namespace std;

struct node{
	int l, r;
	long long sum, lazy;
}tree[800005];

int a[200005];

void pushup(int id){
	tree[id].sum = max(tree[id * 2].sum, tree[id * 2 + 1].sum);
}

void pushdown(int id){
	long long lazytag = tree[id].lazy;
	if(lazytag){
		tree[id * 2].sum += (tree[id * 2].r - tree[id * 2].l + 1) * lazytag;
		tree[id * 2].lazy += lazytag;
		tree[id * 2 + 1].sum += (tree[id * 2 + 1].r - tree[id * 2 + 1].l + 1) * lazytag;
		tree[id * 2 + 1].lazy += lazytag;
		tree[id].lazy = 0;
	}
}

void build(int id, int l, int r){
	tree[id].l = l;
	tree[id].r = r;
	tree[id].sum = 0;
	tree[id].lazy = 0;
	if(l == r){
		tree[id].sum = a[l];
	}
	else{
		int mid = (l + r) / 2;
		build(id * 2, l, mid);
		build(id * 2 + 1, mid + 1, r);
		pushup(id);
	}
}

void update(int id, int l, int r, long long val)
{
    if(l <= tree[id].l && tree[id].r <= r) {
        tree[id].sum += (tree[id].r - tree[id].l + 1) * val;
        tree[id].lazy += val;
    }
    else {
        pushdown(id);
        int mid = (tree[id].l+tree[id].r) / 2;
        if(mid >= l){
        	update(id * 2, l, r, val);
		}
        if(r > mid){
        	update(id * 2 + 1, l, r, val);
		}
        pushup(id);
    }
}

long long query(int id, int l, int r)
{
    if(l <= tree[id].l && tree[id].r <= r) {
        return tree[id].sum;
    }
    else {
        pushdown(id);
        long long ans = 0;
        int mid = (tree[id].l + tree[id].r) / 2;
        if(mid >= l){
        	ans = max(ans, query(id * 2, l, r));
		}
        if(r > mid){
        	ans = max(ans, query(id * 2 + 1, l, r));
		}
        pushup(id);
        return ans;
    }
}

signed main(){
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	build(1, 1, n);
	for(int i = 1; i <= m; i++){
//		cout<<i<<endl;
		char op;
		cin >> op;
		if(op == 'U'){
			int x, y;
			cin >> x >> y;
			update(1, x, x, y - a[x]);
			a[x] = y;
		}else{
			int x, y;
			cin >> x >> y;
			cout<<query(1,x,y)<<endl;;
		}	
	}
	return 0;
}
2024/5/20 11:15
加载中...