问题链接:Problem I
问题简述:
写一个程序,回老师的询问并按老师的要求更新某个同学的成绩。
问题分析:
对数列中的单点更新和区间查询,赤裸裸的线段树,就不多解释了,套模板。
AC通过的C语言程序如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<cstring>
#include<cmath>
#define N 200005
using namespace std;
int tree[N*4];
void build(int l,int r,int rt){
if(l==r){
scanf("%d",&tree[rt]);
}
else{
int mid=(l+r)/2;
build(l,mid,rt*2);
build(mid+1,r,rt*2+1);
tree[rt]=max(tree[rt*2],tree[rt*2+1]);
}
}
void update(int p,int num,int l,int r,int rt){
if(l==r){
tree[rt]=num;
return;
}
else{
int mid=(l+r)/2;
if(p<=mid){
update(p,num,l,mid,rt*2);
}
else{
update(p,num,mid+1,r,rt*2+1);
}
tree[rt]=max(tree[rt*2],tree[rt*2+1]);
}
}
int query(int x,int y,int l,int r,int rt){
if(x<=l&&r<=y){
return tree[rt];
}
else{
int mid=(l+r)/2;
int sum=0;
if(x<=mid){
sum=max(sum,query(x,y,l,mid,rt*2));
}
if(y>mid){
sum=max(sum,query(x,y,mid+1,r,rt*2+1));
}
return sum;
}
}
int main(){
std::ios::sync_with_stdio(false);
int n,m;
while(~scanf("%d%d",&n,&m)){
build(1,n,1);
for(int i=0;i<m;i++){
int x,y;
char c[2];
scanf("%s%d%d",&c,&x,&y);
if(c[0]=='Q'){
cout<<query(x,y,1,n,1)<<endl;
}
else{
update(x,y,1,n,1);
}
}
}
}