Cod sursa(job #428538)

Utilizator laurenttlaurentiu pavel laurentt Data 29 martie 2010 12:40:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

int n,m;
int arb[400100];


void update(int i, int j, int p, int nod, int v) {
	
	if(i==j && j==p) {
		arb[nod]=v;
		return;
	}
	
	int mij=(i+j)>>1;
	
	if(p<=mij) {
		update(i,mij,p,nod*2,v);
	} else {
		update(mij+1,j,p,nod*2+1, v);
	}
	
	arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}


int query(int i, int j, int x, int y, int nod) {
	
	if(x<=i && j<=y)
		return arb[nod];
	
	int mij=(i+j)/2;
	int r=-1;
	
	if(x<=mij)
		r=max( r, query(i,mij,x,y,nod*2) );
	
	if(mij<y)
		r=max( r, query(mij+1, j, x,y, nod*2+1) );
	
	return r;
}




void cit()
{
	scanf("%d%d", &n, &m);
	int i;
    for(i=1; i<=n; i++) {
        int x;
        scanf("%d", &x);
        update(1,n,i,1,x);
    }
	for(i=1; i<=m; i++) {
		int a,b,c;
		
		scanf("%d%d%d", &c,&a,&b);
		
		if(c) {
			//update, a devine b
			update(1,n,a,1,b);
		} else { //query, maximul din [a,b]
			int aux=query(1,n,a,b,1);
			printf("%d\n", aux);
		}
	}
}



int main()
{	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	
	cit();
	return 0;
}