Cod sursa(job #334771)

Utilizator szabotamasSzabo Tamas szabotamas Data 27 iulie 2009 22:57:57
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 100001
#define NMAXX 200002

long q,w,a,b,i,n,m,v[NMAX],t[NMAXX];

void build(long k, long beg, long end){
	if (beg==end){
		t[k]=v[beg];
		return;
	}
	build(2*k,beg,(beg+end)/2);
	build(2*k+1,(beg+end)/2+1,end);
	if (t[k*2]>=t[k*2+1])
		t[k]=t[k*2];
	else
		t[k]=t[k*2+1];
}

void build2(long k, long beg, long end){
	if (beg==end){
		t[k]=b;
		return;
	}
	if (a<=(beg+end)/2)
		build2(2*k,beg,(beg+end)/2);
	else
		build2(2*k+1,(beg+end)/2+1,end);
	if (t[k*2]>=t[k*2+1])
		t[k]=t[k*2];
	else
		t[k]=t[k*2+1];
}

long maxq (long k, long beg, long end){
	if (a>end || b<beg){
		return -1;
	}
	if (a<=beg && end<=b){
		return t[k];
	}
	long x=maxq(2*k,beg,(beg+end)/2);
	long y=maxq(2*k+1,(beg+end)/2+1,end);
	if (x>=y)
		return x;
	else
		return y;
}



int main(){
	ifstream fin ("arbint.in");
	ofstream fout ("arbint.out");
		fin >> n >> m;
		for (i=1; i<=n; i++){
			fin >> v[i];
		}
		build(1,1,n);
		for (w=1; w<=m; w++){
			fin >> q >> a >> b;
			if (q==0){
				fout << maxq(1,1,n) << "\n";
			}
			if (q==1){
				build2(1,1,n);
			}
		}
	fin.close();
	fout.close();
	return 0;
}