线段树(segment tree)点更新,区间最小值

这里写图片描述

void build(int node, int start, int end, int tree[], int a[])
{
    if (start == end)
        tree[node] = a[start];
    else
    {
        int mid = (start + end) / 2;
        build(2 * node, start, mid, tree, a);
        build(2 * node + 1, mid + 1, end, tree, a);
        tree[node] = min(tree[2 * node], tree[2 * node + 1]);
    }
}
void update(int node, int start, int end, int idx, int val, int tree[], int a[]) 
{ 
if (start == end) 
{ 
a[idx] = val; 
tree[node] = val; 
} 
else 
{ 
int mid = (start + end) / 2; 
if (idx >= start && idx <= mid) 
update(2 * node, start, mid, idx, val, tree, a); 
else 
update(2 * node + 1, mid + 1, end, idx, val, tree, a); 
tree[node] = min(tree[2 * node], tree[2 * node + 1]); 
} 
} 
int query(int node, int start, int end, int l, int r, int tree[]) 
{ 
if (l>end || start>r) 
return 100005;//return 0? 
if (l <= start && r >= end) 
return tree[node]; 
int p1, p2; 
int mid = (start + end) / 2; 
p1 = query(2 * node, start, mid, l, r, tree); 
p2 = query(2 * node + 1, mid + 1, end, l, r, tree); 
return min(p1, p2); 
} 
int main() 
{ 
int tree[300020], a[100005]; 
int n, q; 
cin >> n >> q; 
for (int i = 1; i <= n; i++) 
cin >> a[i]; 
build(1, 1, n, tree, a); 
while (q–) 
{ 
char b; 
int x, y; 
cin >> b >> x >> y; 
if (b == ‘q’) 
{ 
int c = query(1, 1, n, x, y, tree); 
cout << c << endl; 
} 
else 
update(1, 1, n, x, y, tree, a); 
} 
return 0; 
}

猜你喜欢

转载自blog.csdn.net/qq_36294146/article/details/78985524
今日推荐