Cod sursa(job #1396259)

Utilizator Aavatar36Russu Vadim Aavatar36 Data 22 martie 2015 12:56:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int arb[300000];

void update(int nod, int st, int dr, int a, int b, int el) {
	//std::cout << nod << " " << st << " " << dr << "\n";
	if (a <= st && dr <= b) {
		arb[nod] = el;
	} else {
		int mij = (st + dr) / 2;
		if (a <= mij)
			update(nod * 2 + 1, st, mij, a, b, el);
		if (b > mij)
			update(nod * 2 + 2, mij + 1, dr, a, b, el);
		arb[nod] = std::max( arb[nod * 2 + 1] , arb[nod * 2 + 2]);
	}
}

int query(int nod, int st, int dr, int a, int b) {
	//std::cout << nod << " " << st << " " << dr << "\n";
	if (a <= st && dr <= b) {
		return arb[nod];
	}
	int mij = (st + dr) / 2;
	int ma = -1, mb = -1;
	if (a <= mij)
		ma = query(nod * 2 + 1, st, mij, a, b);
	if (b > mij)
		mb = query(nod * 2 + 2, mij + 1, dr, a, b);
	return std::max(ma, mb);
}

int main() {
	int n, m;
	fin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		int nr;
		fin >> nr;
		update(0, 0, n - 1, i, i, nr);
	}

	for (int i = 0; i < m; ++i)
	{
		int x, a, b;
		fin >> x >> a >> b;
		if (x == 0) {
			fout << query(0, 0, n - 1, a - 1, b - 1) << "\n";
		} else {
			update(0, 0, n - 1, a - 1, a - 1, b);
		}
	}


	// for (int i = 0; i < 100; ++i)
	// {
	// 	std::cout << arb[i] << " ";
	// }

	return 0;
}