一道比较简单的线段树,不过写了好长时间,build时 lson 和 rson 忘了赋值,没有更新num ,看来水题也是要认真写的
用了hash来记录没一点在树中对应的节点,有叶子节点向根节点更新
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std ;
const int N = 1000000+11 ;
struct Node {
int lson , rson ;
int num ;
int mid() {
return (lson+rson)>>1 ;
}
};
Node arr[N<<2] ;
int hash[N] ;
int n , k , ans ;
void build(int site , int l , int r) {
arr[site].lson =l ; arr[site].rson = r;
if(l == r) {
scanf("%d" , &arr[site].num) ;
hash[k++] = site ;
return ;
}
int mid = (l+r)>>1 ;
build(site<<1 , l , mid) ;
build(site<<1|1 , mid+1 , r) ;
arr[site].num = min(arr[site<<1].num , arr[site<<1|1].num);
}
void query(int site , int l , int r) {
if(l <= arr[site].lson && arr[site].rson <= r) {
ans = min(ans , arr[site].num) ;
return ;
}
int mid = arr[site].mid() ;
if(l <= mid) query(site<<1 , l , r) ;
if(r > mid) query(site<<1|1 , l , r) ;
}
void update(int site) {
while(site> 0) {
arr[site].num = min(arr[site<<1].num , arr[site<<1|1].num) ;
site>>=1 ;
}
}
int main() {//freopen("data.in" ,"r" , stdin) ;
int m ;
while(scanf("%d" ,&n)==1) {
k = 1 ;
build(1 , 1 , n) ;
scanf("%d" , &m) ;
int op , a , b ;
while(m--) {
scanf("%d" ,&op) ;
if(op == 0) {
ans = 1<<30 ;
scanf("%d%d" ,&a , &b) ;
query(1 , a , b);
printf("%d\n" , ans);
}else {
scanf("%d%d" ,&a ,&b) ;
arr[hash[a]].num = b ;
update(hash[a]>>1) ;
}
}
}
}