Cod sursa(job #216218)

Utilizator MirageRobert Sandu Mirage Data 23 octombrie 2008 13:54:58
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<stdio.h>
#define N 100002
#define max(a,b) a>b?a:b
int n,m,v[N],t[4*N],x,y,rez;
void cons(int st, int dr, int poz){
	if(st==dr){
		v[st]=poz;
		return ;
	}
	int m=(st+dr)/2;
	cons(st,m,2*poz);
	cons(m+1,dr,2*poz+1);
}
void update(int p, int val){
	int aux=v[p];
	t[aux]=val;
	aux/=2;
	while(aux){
		t[p]=max(t[p * 2], t[p*2+1]);
		aux/=2;
	}
}
void query(int st,int dr,int poz){
	if(st>y || dr<x)
		return ;
	if(st>=x && dr<=y)
		rez=max(rez,t[poz]);
	else
		if(st<dr){
			int x=(st + dr)/2;
			query(st,x,2*poz);
			query(x+1,dr,2*poz+1);
		}
}
int main () {
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	int a;
	scanf("%d%d",&n,&m);
	cons(1,n,1);
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		update(i,x);
	}
	for(int i=1; i<=m;++i){
		scanf("%d%d%d",&a,&x,&y);
		if(a)
			update(x,y);
		else{
			rez=0;
			query(1,n,1);
			printf("%d\n",rez);
		}
	}
	return 0;
}