您的位置:首页 > 编程语言 > Java开发

蓝桥杯 算法训练 操作格子 JAVA

2017-05-04 20:53 387 查看
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class Main {

PrintWriter out = new PrintWriter(System.out);
InputReader cin = new InputReader(System.in);

final static int MAX_N = 100007;

class Node {
int l, r;
int sum, max;
Node () {

}
Node (int l, int r, int sum, int max) {
this.l = l;
this.r = r;
this.sum = sum;
this.max = max;
}
}

int n, m;
Node tree[] = new Node[MAX_N << 2];
int a[] = new int[MAX_N];

void up(int id) {
tree[id].sum = tree[id << 1].sum + tree[id << 1 | 1].sum;
tree[id].max = Math.max(tree[id << 1].max, tree[id << 1| 1].max);
}

void build(int id, int l, int r) {
tree[id] = new Node(l, r, 0, 0);
if (l == r) {
tree[id].sum = tree[id].max = a[l];
return ;
}
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
up(id);
}

void update(int id, int pos, int val) {
if (tree[id].l == tree[id].r) {
tree[id].sum = tree[id].max = val;
return ;
}
int mid = (tree[id].l + tree[id].r) >> 1;
if (pos <= mid) update(id << 1, pos, val);
else update(id << 1 | 1, pos, val);
up(id);
}

int sum(int id, int l, int r) {
if (l <= tree[id].l && tree[id].r <= r) {
return tree[id].sum;
}
int mid = (tree[id].l + tree[id].r) >> 1;
if (r <= mid) return sum(id << 1, l, r);
else if (l > mid) return sum(id << 1 | 1, l, r);
else {
return sum(id << 1, l, mid) + sum(id << 1 | 1, mid + 1, r);
}
}

int max(int id, int l, int r) {
if (l <= tree[id].l && tree[id].r <= r) {
return tree[id].max;
}
int mid = (tree[id].l + tree[id].r) >> 1;
if (r <= mid) return max(id << 1, l, r);
else if (l > mid) return max(id << 1 | 1, l, r);
else {
return Math.max(max(id << 1, l, mid), max(id << 1 | 1, mid + 1, r));
}
}

void run() throws IOException {
n = cin.nextInt();
m = cin.nextInt();
for (int i = 1; i <= n; ++i)
a[i] = cin.nextInt();
build(1, 1, n);
for (int i = 0; i < m; ++i) {
int type = cin.nextInt();
int l = cin.nextInt();
int r = cin.nextInt();
if (type == 1) update(1, l, r);
else if (type == 2) out.println(sum(1, l, r));
else out.println(max(1, l, r));
}
out.close();
}

public static void main(String[] args) throws IOException {
new Main().run();
}

class InputReader {
private BufferedReader reader;
private StringTokenizer tokenizer;
InputReader(InputStream in) {
reader = new BufferedReader(new InputStreamReader(in));
tokenizer = new StringTokenizer("");
}

private String next() throws IOException {
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}

public Integer nextInt() throws IOException {
return Integer.parseInt(next());
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: