Cod sursa(job #324551)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 16 iunie 2009 15:10:08
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#define MaxN 131072
struct arb {
	int st,dr, val;
};
using namespace std;
fstream fin ("arbint.in",ios::in);
fstream fout("arbint.out",ios::out);
int v[100001], n, m, op, val1, val2;
arb A[400066];

int maxim( int a,int  b){
	if (a > b) return a;
	return b;
};
void init_arb(int nod, int a, int b){
	A[nod].st = a;
	A[nod].dr = b;
	if (a == b) {
		A[nod].val = v[a];
		return;
	};
	int mij = (a + b) / 2;
	init_arb(2 * nod, a, mij);
	init_arb(2 * nod + 1, mij + 1, b);
	A[nod].val = maxim(A[2*nod].val, A[2*nod + 1].val); 
};

void update_arb(int nod){
	int mij = (A[nod].st + A[nod].dr ) / 2;
	if (A[nod].st != A[nod].dr){
		if (mij >= val1)	update_arb(2 * nod);
		else				update_arb(2 * nod + 1);

		A[nod].val = maxim(A[2 * nod].val, A[2 * nod + 1].val);
		return;
	}
	A[nod].val = val2;

		
	
};

int query_arb(int nod, int a, int b){
	
	if (a <= A[nod].st && b >= A[nod].dr)
		return A[nod].val;
	int mij = ( A[nod].st + A[nod].dr ) / 2;
	int max1, max2;
	max1 = -1;
	max2 = -1;
	if (a <= mij)
		max1 = query_arb(2 * nod, a, mij);
	if (b > mij)
		max2 = query_arb(2 * nod + 1, mij + 1, b);
	return maxim(max1,max2);
};

int main(){
	
	fin>>n>>m;
	for (int i = 1; i <= n; i++)
		fin >> v[i]; 
	init_arb(1,1,n);
	for (int i = 1; i <= m; i++){
		fin >> op >> val1 >> val2;
		if (op) {
			v[val1] = val2;
			init_arb (1,1,n);
		}
		else 
			fout << query_arb(1, val1, val2) << '\n';
		
		
	};

return 0;
};