Cod sursa(job #770136)

Utilizator cnt_tstcont teste cnt_tst Data 22 iulie 2012 11:24:38
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define DIM 300010

using namespace std;

int A[DIM], N, M, i, X, a, b, t, poz, val;

ifstream f("arbint.in");
ofstream g("arbint.out");

int query(int nod, int st, int dr) {//maximul din intervalul [a,b] reprezentat de nodul nod
	if (a<=st && b>=dr) {
		return A[nod];
	}
	int maxSt = 0;
	int maxDr = 0;
	int m = ((st+dr)>>1);
	if (a<=m) {
		maxSt = query(nod<<1, st, m);
	} 
	if (b>=m+1) {
		maxDr = query((nod<<1)+1, m+1, dr);
	}
	return maxSt > maxDr ? maxSt : maxDr;
}

void update(int nod, int st, int dr) {
//	if (poz < st || poz > dr) {
		//poz nu e in intervalul st, dr, nu conteaza, dar asta ar putea fi testat doar o data, inainte de apelul functiei
//		return;
//	}
	
	if (st == poz && dr == poz) {
		A[nod] = val;
		return;
	}
	
	int m = ((st+dr)>>1);
	if (poz <= m) 
		update(nod<<1, st, m);
	if (poz >= m+1)
		update((nod<<1)+1, m+1, dr);
	A[nod] = A[nod<<1] > A[(nod<<1)+1] ? A[nod<<1] : A[(nod<<1)+1];
}

int main() {

	f>>N>>M;
	for (i=1;i<=N;i++) {
		f>>X;
		poz = i;
		val = X;
		update(1,1,N);
	}
	
	for (i=1;i<=M;i++) {
		f>>t>>a>>b;
		if (t == 0) {
			g<<query(1,1,N)<<"\n";
		} else {
			poz = a;
			val = b;
			update(1,1,N);
		}
	}
}