1. 程式人生 > >hdu1754 I Hate It

hdu1754 I Hate It

chm 學校 pda ott main update ron hdu1754 其中

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。
這讓很多學生很反感。

不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫一個程序,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。

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 Hint Huge input,the C function scanf() will work better than cin

Author linle

Source 2007省賽集訓隊練習賽(6)_linle專場 我做的第二道線段樹的題,和第一道hdu1166敵兵布陣唯一一點不一樣就是求區間內的max值,只需將sum改為max,讓每個父節點儲存所管轄區域的最大值即可,哎,可是弱弱的我wrong了很多次 #include<iostream>
#include<stdio.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define maxn 222222 int sum[maxn<<2]; int max(int a, int b) { return a > b ? a : b; } 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 a, int b, int l, int r, int rt) { if (l == r) {
sum[rt] = b; return; } int m = (l + r) >> 1; if (a <= m)
Update(a, b, lson); else
Update(a, b, rson);
Pushup(rt); } int query(int L, int R, int l, int r, int rt) { if (L<=l&&r<=R) { return sum[rt]; } int ret = 0; int m = (l + r) >> 1; if (L <= m) ret=max(ret,query(L, R, lson)); if (R > m) ret=max(ret,query(L, R, rson)); return ret; } int main() { int n, m; while (scanf("%d%d", &n, &m) != EOF) {
build(1, n, 1); while (m--) { char c[2]; int a, b;
scanf("%s%d%d",c, &a, &b); if (c[0] == ‘Q‘) printf("%d\n", query(a, b, 1, n, 1)); else Update(a, b, 1, n, 1); } } return 0; }

hdu1754 I Hate It