Cod sursa(job #1501804)

Utilizator tain1234andrei laur tain1234 Data 13 octombrie 2015 20:50:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 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";
		}
	}
}