HDU1754 I Hate It 线段树单点更新

Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input 本题目包含多组测试,请处理到文件结束。 在每个测试的第一行,有两个正整数 N 和 M ( 0

using namespace std;const int maxn = 200010;int n,s[maxn];int segTree[4*maxn+10];void build(int node,int l,int r){if(l == r) segTree[node] = s[l];else {build(node*2,l,(l+r)/2);build(node*2+1,(l+r)/2+1,r);segTree[node] = max(segTree[node*2],segTree[node*2+1]);}}void update(int node,int beg,int en,int ind,int x){if(beg == en) {segTree[node] = x;return;}int m = (beg+en)/2;if(ind <= m) update(node*2,beg,m,ind,x);else update(node*2+1,m+1,en,ind,x);segTree[node] = max(segTree[node*2],segTree[node*2+1]);}int query(int a,int b,int node,int l,int r){if(l > b || r < a) return 1<<31;if(a <= l && r <= b) return segTree[node];return max(query(a,b,node*2,l,(l+r)/2),query(a,b,node*2+1,(l+r)/2+1,r));}int main(){int q;while(scanf(“%d%d”,&n,&q) != EOF) {memset(s,0,sizeof(s));for(int i = 1 ; i <= n ; i ++) scanf(“%d”,&s[i]);for(int i = 1 ; i < maxn*4+10 ; i ++) segTree[i] = 1<<31;build(1,1,n);while(q–) {char s[5];int a,b;scanf(“,s,&a,&b);if(s[0] == ‘Q’) {printf(“%d\n”,query(a,b,1,1,n));}else {update(1,1,n,a,b);}}}return 0;}

,涉水而过的声音此次想起,

HDU1754 I Hate It 线段树单点更新

相关文章:

你感兴趣的文章:

标签云: