hdu 1754

线段树的点更新已经算是入门了,接下来还有区间更新,好像涉及个lazy操作什么的

#include <bits/stdc++.h>
using namespace std;

const int N = 200000;

struct Segtree{
	int l, r, n;
}segtree[N * 4];

void build(int k, int l, int r){
	segtree[k] = {l, r, 0};
	if(l == r)
		return ;
	int mid = (l + r) / 2;
	build(2 * k, l, mid);
	
	build(2 * k + 1, mid + 1, r);
}

void insert(int k, int id, int n){
	if(segtree[k]. l == segtree[k]. r && segtree[k]. l == id){
		segtree[k]. n = n;
		return ;
	}
	int mid = (segtree[k]. l + segtree[k]. r) / 2;
	if(id <= mid)
		insert(2 * k, id, n);
	else
		insert(2 * k + 1, id, n);
	segtree[k]. n = max(segtree[2 * k]. n, segtree[2 * k + 1]. n);  
}

int query(int k, int l, int r){
	if(segtree[k]. l == l && segtree[k]. r == r){
		return segtree[k]. n;
	}
	int mid = (segtree[k]. l + segtree[k]. r) / 2;
	if(r <= mid)
		return query(2 * k, l, r);
	else if(l > mid)
		return query(2 * k + 1, l, r);
	else
		return max(query(2 * k, l, mid), query(2 * k + 1, mid + 1, r));
}

int main()  
{  
    char ch;  
    int x, y, k;
	int n, m;  
    while(scanf("%d%d", &n, &m) == 2){  
        build(1, 1, n);
        for(int i = 1; i <= n; i ++){  
            scanf("%d", &k);  
            insert(1, i, k);  
        }
        while(m --)  
        {  
            getchar();  
            scanf("%c%d%d", &ch, &x, &y);  
            if(ch == 'U'){  
                insert(1, x, y);  
            }  
            else if(ch == 'Q'){   
                printf("%d\n", query(1, x, y));  
            }  
        }  
    }  
    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/80231605