很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
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。
在每个测试的第一行,有两个正整数 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
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define Maxn 200001 5 using namespace std; 6 struct Node{ 7 int left; 8 int right; 9 int max; 10 }; 11 Node Tree[Maxn * 20];//要开大些 12 int Num[Maxn]; 13 int Builder(int root, int left, int right) 14 { 15 Tree[root].left = left; 16 Tree[root].right = right; 17 if(left == right){ 18 return Tree[root].max = Num[left]; 19 } 20 int mid = (left + right) / 2; 21 int L = Builder(2 * root, left, mid); 22 int R = Builder(2 * root + 1, mid + 1, right); 23 return Tree[root].max = max(L, R); 24 } 25 int Update(int root, int pos, int val) 26 { 27 //pos 不在root管理的区间内 28 if(pos < Tree[root].left || pos > Tree[root].right){ 29 return Tree[root].max; 30 } 31 //找到pos点 32 if(Tree[root].left == pos && Tree[root].right == pos){ 33 return Tree[root].max = val; 34 } 35 int L = Update(2 * root, pos, val); 36 int R = Update(2 * root + 1, pos, val); 37 return Tree[root].max = max(L, R); 38 } 39 int Find(int root, int left, int right) 40 { 41 //不包含 42 if(Tree[root].left > right || Tree[root].right < left){ 43 return 0; 44 } 45 //包含 46 if(left <= Tree[root].left && Tree[root].right <= right){ 47 return Tree[root].max; 48 } 49 //部分相交 50 int L = Find(2 * root, left, right); 51 int R = Find(2 * root + 1, left, right); 52 return max(L, R); 53 } 54 55 int main() 56 { 57 int i, j, n, m, p, v; 58 char c; 59 while(~scanf("%d%d", &n, &m)) 60 { 61 for(i = 1; i <= n; i++){ 62 scanf("%d", &Num[i]); 63 } 64 Builder(1, 1, n); 65 for(i = 1; i <= m; i++){ 66 getchar(); 67 scanf("%c %d%d", &c, &p, &v); 68 if(c == 'U'){ 69 Update(1, p, v); 70 } 71 else{ 72 printf("%d ", Find(1, p, v)); 73 } 74 } 75 } 76 return 0; 77 }