题意:
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
题解:
线段树模板题:单点set,区间max。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<vector>
#include<functional>
#include<utility>
#include<set>
#include<map>
#include<cmath>
#include<cctype>
#define INF 0x3f3f3f3f
using namespace std;
#define lson i*2,l,m
#define rson 2*i+1,m+1,r
const int maxn=200000+10;
int maxv[maxn<<2];
void pushup(int i)
{
maxv[i]=max(maxv[2*i],maxv[2*i+1]);
}
void build(int i,int l,int r)
{
if(l==r)
{
scanf("%d",&maxv[i]);
return;
}
int m=(l+r)/2;
build(lson);
build(rson);
pushup(i);
}
int query(int ql,int qr,int i,int l,int r)
{
if(ql<=l&&qr>=r)return maxv[i];
int max_val=-INF;
int m=(l+r)/2;
if(ql<=m)max_val=max(max_val,query(ql,qr,lson));
if(m<qr)max_val=max(max_val,query(ql,qr,rson));
return max_val;
}
void update(int id, int val, int i, int l, int r)
{
if(l==r)
{
maxv[i]=val;
return;
}
int m=(l+r)/2;
if(id<=m)update(id,val,lson);
else update(id,val,rson);
pushup(i);
}
int main()
{
int n,m;
while(cin>>n>>m)
{
build(1,1,n);
while(m--)
{
char s[20];
int u,v;
scanf("%s%d%d",s,&u,&v);
if(s[0]=='Q')cout<<query(u,v,1,1,n)<<endl;
else update(u,v,1,1,n);
}
}
}