HDU 1754----I Hate It
21480 ワード
Description
多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.
あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.
Input
この問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の1行目には、2つの正の整数NとM(0学生ID番号はそれぞれ1からNに編成される.2行目にはN個の整数が含まれ、このN個の学生の初期成績を表し、i番目の数はIDがiの学生の成績を表す.次はM行である.各行には1文字C(‘Q’または’U’のみを取る)と2つの正の整数A,Bがある.Cが‘Q’である場合、これはAからB(A,Bを含む)までのIDの学生の中で、成績が最も高いものはどれくらいかを尋ねる質問操作であることを示す.Cが‘U’である場合、IDがAの学生の成績をBに変更するように要求する更新操作であることを示す.
Output
問合せ操作ごとに、1行に最高成績を出力します.
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
Hint
Huge input,the C function scanf() will work better than cin
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
long long x,y,i,j,m,n,c[200001];
char b;
struct node
{
long long l,r,w,flag;
int dis()
{
return r-l+1;
}
} a[800004];
long long max(long long p,long long q)
{
if(p>q)
return p;
return q;
}
void build(long long k,long long l,long long r)
{
a[k].l=l;
a[k].r=r;
a[k].w=0;
a[k].flag=0;
long long mid=(a[k].r+a[k].l)/2;
if(l==r)
{
a[k].w=c[l];
return;
}
build(k*2,l,mid);
build(k*2+1,mid+1,r);
a[k].w=max(a[k*2].w,a[k*2+1].w);
}
void zengjia(long long k,long long l,long long w)
{
if(a[k].l>=l&&a[k].r<=l)
{
a[k].w=w;
return;
}
long long mid=(a[k].r+a[k].l)/2;
if(mid>=l)
zengjia(k*2,l,w);
if(mid<l)
zengjia(k*2+1,l,w);
a[k].w=max(a[k*2].w,a[k*2+1].w);
}
long long xunwen(long long k,long long l,long long r)
{
if(a[k].l>=l&&a[k].r<=r)
return a[k].w;
long long sum=0;
long long mid=(a[k].r+a[k].l)/2;
if(mid>=l)
sum=max(sum,xunwen(k*2,l,r));
if(mid<r)
sum=max(sum,xunwen(k*2+1,l,r));
return sum;
}
int main()
{
long long jieguo;
while(~scanf("%lld%lld",&m,&n))
{
memset(c,0,sizeof(c));
for(i=1; i<=m; i++)
scanf("%lld",&c[i]);
build(1,1,m);
while(n--)
{
getchar();
scanf("%c%lld%lld",&b,&x,&y);
if(b=='Q')
{
jieguo=xunwen(1,x,y);
printf("%lld
",jieguo);
}
if(b=='U')
zengjia(1,x,y);
}
}
}