hdoj1754 I Hate It
2521 ワード
タイトル:
Problem Descriptionは多くの学校で比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.これは多くの学生に反感を抱かせた.あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.Inputこの問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の最初の行には、2つの正の整数NとM(0 Outputは、各問合せ操作について、1行において最高成績を出力する.Sample Input 5 6 1 2 3 4 Q 1 5 U 3 6 Q 3 4 Q 4 U 2 9 Q 1 5 Sample Output 5 6 5 5 5 9 Hint Huge input,the C function scanf()will work better than cin
この問題は中国語の問題で、基本的な線分ツリー操作です.
参照コード:
#include
#include
#include
#include
#define N 200000+20
using namespace std;
struct node { // ;
int left,right;
int max;
} e[4 * N];
int a[N];
void init() {
memset(a,0,sizeof(a));
memset(e,0,sizeof(e));
}
void input(int n) {
for (int i = 1;i <= n;++i) {
scanf("%d", &a[i]);
}
}
void build(int p,int l,int r) { // ;
e[p].left = l;
e[p].right = r;
e[p].max = a[l];
if (l != r) {
int mid = (l + r) / 2;
build(2*p,l,mid);
build(2*p+1,mid+1,r);
e[p].max = max(e[p*2].max,e[p*2+1].max);
}
}
void update(int p,int pos,int val) { // ;
if (e[p].left == e[p].right) {
e[p].max = val;
}
else {
int mid = (e[p].left+e[p].right) / 2;
if (pos <= mid) update(2*p,pos,val);
else update(2*p+1,pos,val);
e[p].max = max(e[2*p].max,e[2*p+1].max);
}
}
int query(int p,int l,int r) { // ;
if (l <= e[p].left && e[p].right <= r) {
return e[p].max;
}
int ans = 0;
int mid = (e[p].left+e[p].right) / 2;
if (l <= mid) ans = max(ans,query(p*2,l,r));
if (r > mid) ans = max(ans,query(p*2+1,l,r));
return ans;
}
int main() {
int n,m;
while (scanf("%d%d", &n, &m) != EOF) {
init();
input(n);
build(1,1,n);
char c;
for (int i = 1;i <= m;++i) {
scanf(" %c", &c);
int x,y;
if (c == 'Q') {
scanf("%d%d", &x, &y);
int ans = query(1,x,y);
printf("%d
", ans);
}
else {
int std,val;
scanf("%d%d", &std, &val);
update(1,std,val);
}
}
}
return 0;
}