标签:
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0
#include <cstdio>
#include <cstring>
#include <algorithm>
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%d%d",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;
}
标签:
原文地址:http://blog.csdn.net/area_52/article/details/43908817