1 条题解

  • 0
    @ 2023-10-26 19:36:15
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5 + 5;
    int n, blo, m, a[maxn],	// a[i] 的数值(不包含增量) 
    			id[maxn], 	// a[i] 所属的分块编号 
    			c[505];		// 第 i 个分块的整体增量 
    
    void update(int p) {	// 更新第 p 个分块 
    	c[p] = 1e9;
    	for (int i = (p-1)*blo+1; i <= min(n, p*blo); i++)
    		c[p] = min(c[p], a[i]);
    }
    
    int query(int l, int r) {	// 查询区间 [l, r] 最小值 
    	int res = 1e9;
    	if (id[l] + 1 >= id[r]) {
    		for (int i = l; i <= r; i++)
    			res = min(res, a[i]);
    		return res;
    	}
    	for (int i = l; i <= id[l]*blo; i++)
    		res = min(res, a[i]);
    	for (int i = id[l]+1; i < id[r]; i++)
    		res = min(res, c[i]);
    	for (int i = (id[r]-1)*blo+1; i <= r; i++)
    		res = min(res, a[i]);
    	return res;
    }
    
    int main() {
    	scanf("%d", &n);
    	blo = sqrt(n);
    	for (int i = 1; i <= n; i++) {
    		scanf("%d", a+i);
    		id[i] = (i - 1) / blo + 1;
    	}
    	for (int i = 1; i <= id[n]; i++)
    		update(i);
    	scanf("%d", &m);
    	while (m--) {
    		int op;
    		scanf("%d", &op);
    		if (op == 1) {
    			int p, x;
    			scanf("%d%d", &p, &x);
    			a[p] = x;
    			update(id[p]);
    		}
    		else { // op == 2
    			int l, r;
    			scanf("%d%d", &l, &r);
    			printf("%d\n", query(l, r));
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

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