Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0
import java.util.Scanner;
public class ProbelmB {
private static final int MAX_NUM = 1000000;
private static int[] tree = new int[MAX_NUM];
private static Scanner scaner ;
public static void main(String[] args) {
scaner = new Scanner(System.in);
while(scaner.hasNext()) {
int num = scaner.nextInt();
int number = scaner.nextInt();
buildTree(1,num,1);
while(number-- !=0) {
String flag = scaner.next();
int a = scaner.nextInt();
int b = scaner.nextInt();
if (flag.equals("Q")) {
System.out.println(query(a,b,1,num,1));
}else{
updata(a,b,1,num,1);
}
}
}
scaner.close();
}
/*
构建线段树
*/
private static void buildTree(int left,int right,int root) {
if(left == right) {
tree[root] = scaner.nextInt();
return ;
}else{
int mid = (left+right) >> 1;
buildTree(left,mid,root<<1); //左边递归
buildTree(mid + 1,right,root << 1 | 1);
tree[root] = Math.max(tree[root<<1],tree[root<<1 | 1]); //在两个子节点中选取最大值
}
}
/*
点更新
*/
private static void updata(int point,int value,int left,int right,int root) {
if (left == right) {
tree[root] = value; //当left == right 时 将值赋给对应点,然后回溯更新节点的值
return ;
}else{
int mid = (left + right) >> 1;
if (point <= mid) {
updata(point,value,left,mid,root <<1);
}else{
updata(point,value,mid+1,right,root << 1 | 1);
}
tree[root] = Math.max(tree[root<<1],tree[root<<1 | 1]);
}
}
/*
查询区间的最大值
*/
private static int query(int L,int R,int left,int right,int root) {
if (L <= left && right <= R) {
return tree[root];
}else{
int sum = 0,mid = (left +right)>>1;
if (L <= mid ) { //在两边找最大值,
sum = Math.max(sum,query(L,R,left,mid,root << 1 ));
}
if (R > mid) {
sum = Math.max(sum,query(L,R,mid+1,right,root<<1 |1));
}
return sum;
}
}
}