B - I Hate It
2442 ワード
多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.
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」である場合、IDがAからB(A,Bを含む)までの学生の中で、成績が最も高いかを尋ねる質問操作であることを示す.Cが「U」の場合、IDがAの学生の成績をBに変更する更新操作であることを示す.
Output
問合せ操作ごとに、1行に最高成績を出力します.
Sample Input
Sample Output
この問題は線分の木のテンプレートの問題と言えるべきで、比較的に簡単で、線分の木を学んだばかりで、手を練習します
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」である場合、IDがAからB(A,Bを含む)までの学生の中で、成績が最も高いかを尋ねる質問操作であることを示す.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
この問題は線分の木のテンプレートの問題と言えるべきで、比較的に簡単で、線分の木を学んだばかりで、手を練習します
#include
using namespace std;
const int MAXN = 200000 + 10;
int n , m;
int a[MAXN * 4];
void pushup(int x)
{
a[x] = max (a[x << 1] , a[x << 1 | 1]);
}
void build(int left , int right ,int rt)
{
if(left == right)
{
scanf("%d" , &a[rt]);
return;
}
int mid = (left + right) >> 1;
build(left , mid, rt << 1);
build(mid + 1 , right , rt << 1 | 1);
pushup(rt);
}
int que(int x , int y , int left , int right , int rt)
{
if(left >= x && right <= y)
{
return a[rt];
}
int mid = (left + right) >> 1;
int maxx = 0;
if(mid >= x)
{
maxx = max(maxx , que(x , y , left , mid , rt << 1));
}
if(mid < y)
{
maxx = max (maxx , que(x , y , mid + 1 , right , rt << 1 | 1));
}
return maxx;
}
void data(int x , int k , int left , int right , int rt)
{
if(left == right)
{
a[rt] = k;
return;
}
int mid = (left + right) >> 1;
if(mid < x)
data(x , k , mid + 1, right , rt << 1 | 1);
if(mid >= x)
data(x , k , left , mid , rt << 1);
pushup(rt);
}
int main()
{
while(~scanf("%d %d" , &n , &m))
{
build(1, n , 1);
char q;
int x , y ;
while(m --)
{
cin >> q >> x >> y;
if(q == 'Q')
{
printf("%d
" ,que(x , y , 1 , n , 1));
}
else
{
data(x , y , 1 , n , 1);
}
}
}
}