Cod sursa(job #498345)

Utilizator theodora_maneaManea Theodora Maria theodora_manea Data 4 noiembrie 2010 21:50:50
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>

int arb[262144],n,m,i,poz,a,b,x,max;

int maxim(int a,int b) {
	if (a>b) return a;
	else return b;
}

void insert(int nod,int st,int dr) {
	int m;
	m=(st+dr)/2;
	if (st==poz && dr==poz) {
		arb[nod]=x;
		return;
	}
	if (poz<=m) insert(2*nod,st,m);
	else insert(2*nod+1,m+1,dr);
	arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
}

void cautare(int nod, int st,int dr) {
	int m;
	if (a<=st && dr<=b) {
		if (arb[nod]>max) max=arb[nod];
		return;
	}
	m=(st+dr)/2;
	if (a<=m) cautare(nod*2,st,m);
	if (b>m) cautare(nod*2+1,m+1,dr);
}

int main () {
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (i=1; i<=n; i++) {
		scanf("%d",&x);
		poz=i;
		insert(1,1,n);
	}
	for (i=1; i<=m; i++) {
		scanf("%d%d%d",&x,&a,&b);
		if (x==0) {
			max=-1;
			cautare(1,1,n);
			printf("%d\n",max);
		}
		else {
			poz=a;
			x=b;
			insert(1,1,n);
		}
	}
	return 0;
}