Cod sursa(job #530994)

Utilizator icepowdahTudor Didilescu icepowdah Data 8 februarie 2011 19:15:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <limits>
#include <fstream>
using namespace std;

#define NMAX 100001
#define SIZE_MAX NMAX<<2

struct nod {
	int st, dr;
	int max;
};

int N, M, arb_int[SIZE_MAX];

void update(int nod, int st, int dr, int poz, int val) {	
	if (st==dr) {
		arb_int[nod] = val;
	}
	else {
		int mid = (st+dr)/2, left=nod<<1, right=left|1;
		if (poz<=mid) update(left,st,mid,poz,val);
		else update(right,mid+1,dr,poz,val);
		arb_int[nod] = max(arb_int[left],arb_int[right]);
	}
}

int query(int nod, int st, int dr, int a, int b) {	
	if (a<=st && b>=dr) {
		return arb_int[nod];
	}
	int mid = (st+dr)/2;
	int max_st = INT_MIN, max_dr=INT_MIN;
	if (a<=mid) max_st = query(nod<<1,st,mid,a,b);
	if (b>mid) max_dr = query((nod<<1)|1,mid+1,dr,a,b);
	return max(max_st, max_dr);
}

int main() {
	int i,x,a,b;	
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);	
	scanf("%d %d",&N,&M);
	for (i=1;i<=N;i++) {		
		scanf("%d",&x);
		update(1,1,N,i,x);
	}
	for (i=1;i<=M;i++) {		
		scanf("%d %d %d",&x,&a,&b);
		if (x) update(1,1,N,a,b);
		else printf("%d\n",query(1,1,N,a,b));
	}	
	return 0;
}