HDU1754-I Hate It
题目大意:
多组样例,每组样例\(n\)个学生,每个学生的成绩为\(q_i\),\(m\)次操作。
两种操作:
当\(C\)为\('Q'\)的时候,表示这是一条询问操作,它询问\(ID\)从\(A\)到\(B\)(包括\(A,B\))的学生当中,成绩最高的是多少。
当\(C\)为\('U'\)的时候,表示这是一条更新操作,要求把\(ID\)为\(A\)的学生的成绩更改为\(B\)。
思路:
线段树入门题,考察单点修改,区间最大值查询,此处仅作复习用处,不对线段树基础进行讲解。
Code:
#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mid (l+r)/2
using namespace std;
const int maxn=2e5+10;
//单点修改 区间查询
int t,x,y,n,m;
char s[10];
int q[maxn];
struct node{
int tr[maxn],lazy[maxn];
void pushup(int rt){
tr[rt]=max(tr[rt<<1],tr[rt<<1|1]);
}
void pushdown(int l,int r,int rt){
}
void build(int l,int r,int rt){
if(l==r){
tr[rt]=q[l];
return ;
}
build(lson);
build(rson);
pushup(rt);
}
void update(int L,int R,int l,int r,int rt,int val){
if(L<=l&&r<=R){
tr[rt]=val;
return ;
}
if(L<=mid){
update(L,R,l,mid,rt<<1,val);
}
if(R>mid){
update(L,R,mid+1,r,rt<<1|1,val);
}
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return tr[rt];
}
int sum=-0x3f3f3f3f;
if(L<=mid){
sum=max(sum,query(L,R,lson));
}
if(R>mid){
sum=max(sum,query(L,R,rson));
}
return sum;
}
}sgt;
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=1;i<=n;++i){
scanf("%d",&q[i]);
}
sgt.build(1,n,1);
while(m--){
scanf("%s",s);
scanf("%d%d",&x,&y);
if(s[0]=='Q'){
printf("%d\n",sgt.query(x,y,1,n,1));
}
else{
sgt.update(x,x,1,n,1,y);
}
}
}
return 0;
}