Cod sursa(job #1742782)

Utilizator AplayLazar Laurentiu Aplay Data 17 august 2016 00:50:14
Problema Arbori de intervale Scor 30
Compilator java Status done
Runda Arhiva educationala Marime 2.34 kb
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class Main {

	static int N, Q, operation, a, b;
	static int[] values, sTree;

	public static int[] parseLine(String line) {
		String[] elements = line.split(" ");
		int[] result = new int[elements.length];

		for (int it = 0; it < elements.length; ++it) {
			result[it] = Integer.parseInt(elements[it]);
		}

		return result;
	}

	public static int max(int a, int b) {
		return a < b ? b : a;
	}

	public static void update(int[] sTree, int node, int left, int right, int a, int b, int value) {
		if (left == right) {
			sTree[node] = value;
		} else {
			int middle = left + (right - left) / 2;
			if (a <= middle) {
				update(sTree, 2 * node + 1, left, middle, a, b, value);
			}
			if (b > middle) {
				update(sTree, 2 * node + 2, middle + 1, right, a, b, value);
			}
			sTree[node] = max(sTree[2 * node + 1], sTree[2 * node + 2]);
		}
	}

	public static int query(int[] sTree, int node, int left, int right, int a, int b) {
		if (a <= left && right <= b) {
			return sTree[node];
		} else {
			int middle = left + (right - left) / 2, first = 0, second = 0;
			if (a <= middle) {
				first = query(sTree, 2 * node + 1, left, middle, a, b);
			}
			if (middle < b) {
				second = query(sTree, 2 * node + 2, middle + 1, right, a, b);
			}
			return max(first, second);
		}
	}

	public static void main(String[] args) throws Exception {
		BufferedReader reader = new BufferedReader(new FileReader("arbint.in"));
		BufferedWriter writer = new BufferedWriter(new FileWriter("arbint.out"));

		String line = reader.readLine();
		int[] numbers = parseLine(line);

		N = numbers[0];
		Q = numbers[1];

		line = reader.readLine();
		values = parseLine(line);
		sTree = new int[3 * N];

		for (int it = 0; it < N; ++it) {
			update(sTree, 0, 0, N - 1, it, it, values[it]);
		}

		for (int it = 0; it < Q; ++it) {
			line = reader.readLine();
			numbers = parseLine(line);
			operation = numbers[0];
			a = numbers[1];
			b = numbers[2];

			switch (operation) {
			case 0:
				writer.write(query(sTree, 0, 0, N - 1, a - 1, b - 1) + "\n");
				break;
			default:
				update(sTree, 0, 0, N - 1, a - 1, a - 1, b);
				break;
			}
		}
		
		reader.close();
		writer.close();
	}

}