蓝桥杯 算法训练 操作格子 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()); } } }
相关文章推荐
- 蓝桥杯 算法训练 操作格子 (线段树)
- 蓝桥杯 算法训练 操作格子
- 蓝桥杯 ALGO-8 算法训练 操作格子(线段树)
- [蓝桥杯]算法训练 操作格子-链式线段树
- 蓝桥杯_算法训练_操作格子
- 蓝桥杯 算法训练 操作格子
- 算法笔记_064:蓝桥杯练习 操作格子(Java)
- 蓝桥杯-算法训练 操作格子
- 蓝桥杯 算法训练 操作格子(线段树)
- 蓝桥杯 算法训练 操作格子 (线段树模板)
- 蓝桥杯 算法训练 操作格子
- 蓝桥杯_ 算法训练 操作格子
- 蓝桥杯 算法训练 操作格子 (最基本的线段树)
- 蓝桥杯-算法训练--ALGO-8 操作格子
- 蓝桥杯 算法训练 操作格子 [ 线段树 ]
- 算法-蓝桥杯-算法训练 操作格子(C++)
- 蓝桥杯算法训练_格子操作_线段树_区间和与区间最值
- 蓝桥杯 算法训练 操作格子
- 蓝桥杯算法训练——操作格子(线段树+单点更新+区间求和+求最大值)
- 蓝桥杯 算法训练 操作格子(线段树,点更新)