Cod sursa(job #644477)

Utilizator theodora_maneaManea Theodora Maria theodora_manea Data 6 decembrie 2011 20:01:22
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

int arb[1<<19];
int i,n,m,a,b,poz,x,op;

void actualizare(int nod,int st,int dr) {
	if (st>=poz && dr<=poz) {
		arb[nod]=x;
		return;
	}
	int m=(st+dr)>>1;
	if (poz<=m) actualizare(nod<<1,st,m);
	       else actualizare((nod<<1)+1,m+1,dr);
	
	arb[nod]=max(arb[nod<<1],arb[(nod<<1)+1]);
}

int interogare(int nod,int st,int dr) {
	int m,x1,x2;
	x1=x2=0;
	if (st>=a && dr<=b) 
		return arb[nod];
	m=(st+dr)>>1;
	if (a<=m) x1=interogare(nod<<1,st,m);
	if (b>m) x2=interogare((nod<<1)+1,m+1,dr);
	if (x1>x2) return x1;
	return x2;
}

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;
		actualizare(1,1,n);
	}
	for (i=1; i<=m; ++i) {
		scanf("%d%d%d",&op,&a,&b);
		if (op==1) {
			poz=a;
			x=b;
			actualizare(1,1,n);
		}
		else 
			printf("%d\n",interogare(1,1,n));
	}
	return 0;
}