1 条题解

  • 0
    @ 2023-11-7 18:36:09
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 5;
    int tr[maxn<<2];
    
    #define lson l, mid, rt<<1
    #define rson mid+1, r, rt<<1|1
    void push_up(int rt) { // 用更新过的两个子节点信息来更新当前节点信息 
    	tr[rt] = max(tr[rt<<1], tr[rt<<1|1]);
    }
    void build(int l, int r, int rt) {
    	if (l == r) {
    //		tr[rt] = a[l];
    		scanf("%d", tr + 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) {
    		tr[rt] = x;
    		return;
    	}
    	int mid = (l + r) / 2;
    	(p <= mid) ? update(p, x, lson) : update(p, x, rson);
    	push_up(rt);
    }
    // 查询 a[L..R] 的最大值
    int query(int L, int R, int l, int r, int rt) {
    	if (L <= l && r <= R)	// 区间完全被覆盖 
    		return tr[rt];
    	int res = 0, mid = (l + r) / 2;
    	if (L <= mid) res = max(res, query(L, R, lson));
    	if (R > mid) res = max(res, query(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 
    			printf("%d\n", query(x, y, 1, n, 1));
    	}
    	return 0;
    }
    
    • 1

    信息

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