Cod sursa(job #1504899)

Utilizator DacianBocea Dacian Dacian Data 18 octombrie 2015 15:11:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
using namespace std;
int ARB[400000], N, M, a, b, c, pos, val, max1 = -1, start, finish;
void update(int nod, int left, int right){
	if (left == right){ ARB[nod] = val; return; }
	int  m = (left + right) / 2;
	if (pos <= m)update(2 * nod, left, m);
	else update(2 * nod + 1, m + 1, right);
	ARB[nod] = ARB[2 * nod] > ARB[2 * nod + 1] ? ARB[2 * nod] : ARB[2 * nod + 1];
}
void q(int nod, int left, int right){
	{
		if (start <= left && right <= finish)
		{
			if (max1 < ARB[nod]) max1 = ARB[nod];
			return;
		}

		int div = (left + right) / 2;
		if (start <= div) q(2 * nod, left, div);
		if (div < finish) q(2 * nod + 1, div + 1, right);
	}
}
int main(){
	ofstream of("arbint.out");
	ifstream f("arbint.in");
	f >> N >> M;
	for (int i = 1; i <= N; ++i){
		f >> val;
		pos = i;
		update(1, 1, N);
	}
	for (int i = 0; i < M; ++i){
		f >> a >> b >> c;
		if (a == 1){
			pos = b; val = c;
			update(1, 1, N);
		}
		else{
			start = b; finish = c;
			max1 = -1;
			q(1, 1, N);
			of << max1 << "\n";
		}
	}
}