トピックの背景
多くの学校のより人気の習慣。先生は本当に最高のスコアの中からあるので、そのためにとてもので、お願いしたいです。これは、多くの学生はうんざりしていることができます。
タイトル説明
あなたがそれを好きかどうか、今あなたがする必要があるかどうかは、それが尋ねた先生をシミュレートするプログラムを書くために、教師の要件に準拠している、です。もちろん、教師は時々、特定の生徒の成果を更新する必要があります
入力形式
最初の行は、2つの正の整数N及びM(0 <N <= 200000,0 <M <5000)があり、操作回数や学生の数を表します。学生のID番号は、1からNにコンパイルされています 2行目は、i番目の生徒IDが結果、iの代表であるN初期学生の成績を表す、N個の整数を含みます。次のM行。各行は、文字Cを持っており、2つの正の整数A、B。(単に「Q」または「U」を取ります)Cは、これが照会操作であることを「Q」の時間である場合、それは学生の間(A、Bを含む)BからIDを照会し、最高のスコアです。ときCは、現在の学生のスコアは、学生のための成績をIDの変更を入れてB、Bよりも低い場合、または変更しない場合、これは、更新操作であることを、「U」の時間です。
出力フォーマット
行の最も高いスコアを出力する各照会操作のため
サンプル入力と出力
入力#1の複製
5 6
1 2 3 4 5
Q 1 5
3 6
Q 3 4
Q 4 5
2 9で
Q 1 5
コピー出力#1
5
6
5
9
解像度:
修正のシングルポイント、クエリーインターバル。
重要なセグメントツリー。
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#define re register
#define Max 400100
#define gc getchar
#define lson x<<1
#define rson x<<1|1
int max(int a, int b) {return a > b ? a : b;}
struct HATE {
int l, r, max;
}t[Max << 1];
int m, n, pts[Max >> 1];
void up(int x) {t[x].max = max(t[lson].max, t[rson].max);}
void build(int l, int r, int x) {
t[x].l = l; t[x].r = r;
if(l == r) {
t[x].max = pts[l];
return ;
}
int mid = l + r >> 1;
build(l, mid, lson); build(mid+1, r, rson);
up(x);
}
void data(int f, int x, int k) {
if(t[x].l == f && t[x].r == f) {
if(t[x].max < k) t[x].max = k;
return ;
}
int mid = t[x].l + t[x].r >> 1;
if(f <= mid) data(f,lson,k);
if(f > mid) data(f,rson,k);
up(x);
}
int Ask(int l, int r, int x) {
if(t[x].l >= l && t[x].r <= r)
return t[x].max;
int mid = t[x].l + t[x].r >> 1;
int ans = - 9999999;
if(l <= mid) ans = max(ans, Ask(l,r,lson));
if(r > mid) ans = max(ans, Ask(l,r,rson));
return ans;
}
int main() {
scanf("%d%d",&n,&m);
for(re int i = 1; i <= n; ++ i) scanf("%d", &pts[i]);
build(1, n, 1); int l, r; char opt;
for(re int i = 1; i <= m; ++ i) {
std :: cin >> opt;
scanf("%d %d",&l,&r);
if(opt == 'U') data(l,1,r);
else printf("%d\n",Ask(l,r,1));
}
return 0;
}