1 条题解

  • 0
    @ 2023-11-7 18:59:13
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 5;
    int tmax[maxn<<2], tmin[maxn<<2];	// 最大值,最小值 
    long long tsum[maxn<<2];			// 和 
    
    #define lson l, mid, rt<<1
    #define rson mid+1, r, rt<<1|1
    void push_up(int rt) { // 用更新过的两个子节点信息来更新当前节点信息 
    	tmax[rt] = max(tmax[rt<<1], tmax[rt<<1|1]);
    	tmin[rt] = min(tmin[rt<<1], tmin[rt<<1|1]);
    	tsum[rt] = tsum[rt<<1] + tsum[rt<<1|1];
    }
    void build(int l, int r, int rt) {
    	if (l == r) {
    		scanf("%d", tmax + rt);
    		tmin[rt] = tsum[rt] = tmax[rt];
    		return;
    	}
    	int mid = (l + r) / 2;
    	build(lson);
    	build(rson);
    	push_up(rt);
    }
    // 将 a[p] 修改为 x 
    void update(int p, int x, int l, int r, int rt) {
    	if (l == r) {
    		tmax[rt] = tmin[rt] = tsum[rt] = x;
    		return;
    	}
    	int mid = (l + r) / 2;
    	(p <= mid) ? update(p, x, lson) : update(p, x, rson);
    	push_up(rt);
    }
    int query_max(int L, int R, int l, int r, int rt) {
    	if (L <= l && r <= R)	// 区间完全被覆盖 
    		return tmax[rt];
    	int res = 0, mid = (l + r) / 2;
    	if (L <= mid) res = max(res, query_max(L, R, lson));
    	if (R > mid) res = max(res, query_max(L, R, rson));
    	return res;
    }
    int query_min(int L, int R, int l, int r, int rt) {
    	if (L <= l && r <= R)	// 区间完全被覆盖 
    		return tmin[rt];
    	int res = 1e9, mid = (l + r) / 2;
    	if (L <= mid) res = min(res, query_min(L, R, lson));
    	if (R > mid) res = min(res, query_min(L, R, rson));
    	return res;
    }
    long long query_sum(int L, int R, int l, int r, int rt) {
    	if (L <= l && r <= R)	// 区间完全被覆盖 
    		return tsum[rt];
    	long long res = 0;
    	int mid = (l + r) / 2;
    	if (L <= mid) res += query_sum(L, R, lson);
    	if (R > mid) res += query_sum(L, R, rson);
    	return res;
    }
    
    int n, q, op, x, y;
    
    int main() {
    	scanf("%d", &n);
    	build(1, n, 1);
    	scanf("%d", &q);
    	while (q--) {
    		scanf("%d%d%d", &op, &x, &y);
    		if (op == 1)
    			update(x, y, 1, n, 1);
    		else if (op == 2)
    			printf("%d\n", query_max(x, y, 1, n, 1));
    		else if (op == 3)
    			printf("%d\n", query_min(x, y, 1, n, 1));
    		else 
    			printf("%lld\n", query_sum(x, y, 1, n, 1));
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    26
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者