I Hate It
Problem Description
這讓很多學生很反感。
不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程序,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。
Input
在每個測試的第一行,有兩個正整數 N 和 M ( 0<N<=200000,0<M<5000 ),分別代表學生的數目和操作的數目。
學生ID編號分別從1編到N。
第二行包含N個整數,代表這N個學生的初始成績,其中第i個數代表ID爲i的學生的成績。
接下來有M行。每一行有一個字符 C (只取'Q'或'U') ,和兩個正整數A,B。
當C爲'Q'的時候,表示這是一條詢問操作,它詢問ID從A到B(包括A,B)的學生當中,成績最高的是多少。
當C爲'U'的時候,表示這是一條更新操作,要求把ID爲A的學生的成績更改爲B。
Output
Sample Input
5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5
Sample Output
5 6 5 9
單點更新
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=222222;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[maxn<<2];
void pushup(int rt)
{
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sum[rt]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(int l,int r,int rt,int p,int w)
{
if(l==r)
{
sum[rt]=w;
return;
}
int m=(l+r)>>1;
if(p<=m)update(lson,p,w);
else update(rson,p,w);
pushup(rt);
}
int query(int l,int r,int rt,int L,int R)
{
if(L<=l&&R>=r)
return sum[rt];
int m=(l+r)>>1;
int ret=0;
if(L<=m)ret=max(ret,query(lson,L,R));
if(R>m)ret=max(ret,query(rson,L,R));
return ret;
}
int main()
{
int n,m,a,b;
char c[2];
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
while(m--)
{
scanf("%s%d%d",&c,&a,&b);
if(c[0]=='Q')printf("%d\n",query(1,n,1,a,b));
else if(c[0]=='U')update(1,n,1,a,b);
}
}
return 0;
}