hiho第十九周

典型的线段树单点更新及区间查询

代码如下:

#include <bits/stdc++.h>
#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\n", query_min( 1, y, z));
		}
		else
			update_dot( 1, y, z);
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值