제1 9 주

전형 적 인 선분 트 리 단일 업데이트 및 구간 조회
코드 는 다음 과 같 습 니 다:
#include 
#define maxn 1000010
using namespace std;
struct tree{
    int left, right;
    int min;
} tree[maxn * 4];
int a[maxn];
void build( int id, int l, int r){
    tree[id].left = l;
    tree[id].right = r;
    if ( l == r){
        tree[id].min = a[l];
    }
    else{
        int mid = ( l + r) / 2;
        build( id * 2, l, mid);
        build( id * 2 + 1, mid + 1, r);
        tree[id].min = min( tree[id * 2].min, tree[id * 2 + 1].min);
    }
}
void update_dot( int id, int pos, int val){
    if ( tree[id].left == tree[id].right){
        tree[id].min = val;
    }
    else{
        int mid = ( tree[id].left + tree[id].right) / 2;
        if ( pos <= mid)    update_dot( id * 2, pos, val);
        else    update_dot( id * 2 + 1, pos, val);
        tree[id].min = min( tree[id * 2].min, tree[id * 2 + 1].min);
    }
}
int query_min( int id, int l, int r){
    if ( tree[id].left == l && tree[id].right == r)
        return tree[id].min;
    else{
        int mid = ( tree[id].left + tree[id].right) / 2;
        if ( r <= mid)  return query_min( id * 2, l, r);
        else if ( l > mid)  return query_min( id * 2 + 1, l, r);
        else    return min( query_min(id * 2, l, mid), query_min( id * 2 + 1, mid + 1, r));
    }
}
int main()
{
	int n, q, x, y, z;
	
	scanf( "%d", &n);
	for ( int i = 1; i <= n; i++){
		scanf( "%d", &a[i]);
	}	
	build( 1, 1, n);
	scanf( "%d", &q);
	while ( q--){
		scanf( "%d%d%d", &x, &y, &z);
		if ( x == 0){
			printf( "%d
", query_min( 1, y, z)); } else update_dot( 1, y, z); } return 0; }

좋은 웹페이지 즐겨찾기