题意:中文题
思路:线段树基本应用,单点替换区间最值
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 200000+5;
const int INF = 1e9;
//线段树需要维护的信息
int sum[maxn*4];
#define lson i*2,l,m
#define rson i*2+1,m+1,r
//i结点收集子结点的统计结果
void PushUp(int i)
{
sum[i]=max(sum[i*2],sum[2*i+1]);
}
//递归建立线段树
void build(int i,int l,int r)
{
if (l==r)
{
scanf("%d",&sum[i]);
return;
}
int m = (l+r)/2;
build(lson);
build(rson);
PushUp(i); //收集子结点的结果
}
//在当前区间[l,r]内查询区间[ql,qr]间的目标值
//且能执行这个函数的前提是:[l,r]与[ql,qr]的交集非空
//本函数返回的结果也就是它们交集的目标值
int query(int ql,int qr,int i,int l,int r)
{
//目的区间包含当前区间
if (ql <=l && qr>=r)
return sum[i];
int m = (l+r)/2;
int ans = -INF;
if (ql <= m)
ans = max(ans,query(ql,qr,lson));
if (m < qr)
ans= max(ans,query(ql,qr,rson));
return ans;
}
//如果本题是单点更新,可以在区间[l,r]内使得第id数的值+val
//如果本题是区间更新,可以updata的参数需要将id改为ql,qr
void update(int id,int val,int i,int l,int r)
{
if (l==r)
{
sum[i]=val;
return;
}
int m = (l+r)/2;
if (id <= m)
update(id,val,lson);
else
update(id,val,rson);
PushUp(i); //时刻记得维护i结点统计信息的正确性
}
int main()
{
int cas = 1;
int n,m;
while (scanf("%d%d",&n,&m)!=EOF)
{
build(1,1,n);
while (m--)
{
char str[20];
int u,v;
scanf("%s%d%d",str,&u,&v);
if (str[0]=='Q')
{
printf("%d\n",query(u,v,1,1,n));
}
else if (str[0] == 'U')
{
update(u,v,1,1,n);
}
}
}
}