Cod sursa(job #216228)

Utilizator MirageRobert Sandu Mirage Data 23 octombrie 2008 15:14:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 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,mij;
void cons(int st, int dr, int poz){
	if(st==dr){
		v[st]=poz;
		return ;
	}
	int q=(st+dr)/2;
	cons(st,q,2*poz);
	cons(q+1,dr,2*poz+1);
}
void update(int p, int val){
	int q=v[p];
	t[q]=val;
	q/=2;
	while(q){
		t[q]=max(t[q * 2], t[q*2+1]);
		q/=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 q=(st + dr)/2;
			query(st,q,2*poz);
			query(q+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;
}