69,369
社区成员
发帖
与我相关
我的任务
分享
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
Tree tree = createTree(1, n);
for (int i = 1; i <= n; i++) {
insert(tree, scanner.nextInt(), i);
}
int order[][] = new int[m][3];
for (int i = 0; i < order.length; i++) {
for (int j = 0; j < order[0].length; j++) {
order[i][j] = scanner.nextInt();
}
}
for (int i = 0; i < order.length; i++) {
switch (order[i][0]) {
case 1:
change(tree,order[i][1],order[i][2]);
break;
case 2:
System.out.println(getsum(tree,order[i][1],order[i][2]));
break;
case 3:
System.out.println(getmax(tree,order[i][1],order[i][2]));
break;
default:
break;
}
}
}
private static int getsum(Tree tree, int i, int j) {
if (tree.left==i&&tree.right==j) {
return tree.sum;
}
int mid = (tree.left + tree.right) / 2;
if (j<=mid) {
return getsum(tree.lchild, i, j);
}
else if (i>mid) {
return getsum(tree.rchild, i, j);
}
else {
return getsum(tree.lchild, i, mid)+getsum(tree.rchild, mid+1, j);
}
}
private static int getmax(Tree tree, int i, int j) {
// TODO Auto-generated method stub
if (tree.left==i&&tree.right==j) {
return tree.max;
}
int mid = (tree.left + tree.right) / 2;
if (j<=mid) {
return getmax(tree.lchild, i, j);
}else if (i>mid) {
return getmax(tree.rchild, i, j);
}
else {
return max(getmax(tree.lchild, i, mid),getmax(tree.rchild, mid+1, j));
}
}
private static void change(Tree tree, int i, int j) {
// TODO Auto-generated method stub
if (tree.left == tree.right ) {
tree.max = j;
tree.sum = j;
return;
}
int mid = (tree.left + tree.right) / 2;
if (i <= mid) {
change(tree.lchild, i, j);
} else {
change(tree.rchild, i, j);
}
tree.max=max(tree.lchild.max,tree.rchild.max);
tree.sum=tree.lchild.sum+tree.rchild.sum;
}
private static int max(int max, int max2) {
// TODO Auto-generated method stub
return max>max2?max:max2;
}
private static void insert(Tree tree, int a, int index) {
tree.max = max(tree.max, a);
tree.sum +=a;
if (tree.left == tree.right) {
return;
}
if (index <= ((tree.left + tree.right) / 2)) {
insert(tree.lchild, a, index);
} else {
insert(tree.rchild, a, index);
}
}
static Tree createTree(int min, int max) {
Tree tree = new Tree();
tree.left = min;
tree.right = max;
tree.max = 0;
tree.sum = 0;
if (min == max) {
return tree;
}
int mid = (min + max) / 2;
tree.lchild = createTree(min, mid);
tree.rchild = createTree(mid + 1, max);
return tree;
}
}
class Tree {
int max, sum;
int left, right;
Tree lchild, rchild;
}