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

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());
		}
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值