Cod sursa(job #293146)

Utilizator katakunaCazacu Alexandru katakuna Data 31 martie 2009 23:20:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
using namespace std;
#include <cstdio>
#include <algorithm>

#define Nmax 100010

int v[Nmax], a[4 * Nmax];
int n, m, i, sol, x, y, t, mij;


void update(int nod, int st, int dr, int val, int poz){

	mij = (st + dr) / 2;
	if( st == dr ){
		a[nod] = val;
		return ;
	}
	
	if( poz <= mij ) update(nod<<1, st, mij, val, poz);
	else update( (nod<<1)+1, mij+1, dr, val, poz);
	
	a[nod] = max( a[nod<<1], a[(nod<<1) + 1] );
	
}

void query(int nod, int st, int dr, int p, int u){

	int mij = (st + dr) / 2;
	if( p <= st && dr <= u ){
		sol = max(sol, a[nod]);
		return ;
	}

	if( p <= mij ) query(nod<<1, st, mij, p, u);
	if( u > mij ) query((nod<<1)+1, mij+1, dr, p, u);
}

int main(){


	FILE *f = fopen("arbint.in", "r");
	FILE *g = fopen("arbint.out", "w");

	fscanf(f,"%d %d",&n, &m);
	for( i = 1; i <= n; i++ )
		fscanf(f,"%d",&v[i]);
	
	for(i = 1; i <= n; i++)
		update(1, 1, n, v[i], i);
	
	
	for(i = 1; i <= m; i++){
		fscanf(f,"%d %d %d",&t, &x, &y);
		
		if(t == 1) 
			update(1, 1, n, y, x);
		
		else{
			sol = 0;
			query(1, 1, n, x, y);
			fprintf(g,"%d\n",sol);
		}
	}
	
	fclose(f);
	fclose(g);
	
	return 0;

}