Cod sursa(job #1420765)

Utilizator cosgbCosmin cosgb Data 18 aprilie 2015 22:16:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>

using namespace std;
vector<int> v;
int val;

const int interval = 100000;

void update(int node, int left, int right, int a, int b)
{
	if (a <= left && right <= b) {
		v[node] = val;
	} else {
		int mid = left + ((right - left) >> 1);
		if (a <= mid) {
			update(node << 1, left, mid, a, b);
		}
		if (b > mid) {
			update((node << 1) + 1, mid + 1, right, a, b);
		}
		v[node] = max(v[(node << 1) + 1], v[node << 1]);
	}
}

int query(int node, int left, int right, int a, int b)
{
	if (a <= left && right <= b)
		return v[node];
	int l_v = 0, r_v = 0;
	int mid = left + ((right - left) >> 1);
	if (a <= mid) {
		l_v = query(node << 1, left, mid, a, b);
	}
	if (b > mid) {
		r_v = query((node << 1) + 1, mid + 1, right, a, b);
	}
	return max(l_v, r_v);
}

int main()
{
	int N, M, op, pos1, pos2;
	ifstream in; ofstream out;
	in.open("arbint.in"); out.open("arbint.out");
	in >> N >> M;

	v.insert(v.begin(), pow(2, 18), 0);

	for (int i = 0; i < N; i++) {
		in >> val;
		update(1, 1, N, i + 1, i + 1);
	}

	for (int i = 0; i < M; i++) {
		in >> op;
		if (op) {
			in >> pos1 >> val;
			update(1, 1, N, pos1, pos1);
		} else {
			in >> pos1 >> pos2;
			out << query(1, 1, N, pos1, pos2) << "\n";
		}
	}

	in.close();
	out.close();

	return 0;
}