Cod sursa(job #146087)

Utilizator tvladTataranu Vlad tvlad Data 1 martie 2008 10:21:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>

const int AI_SIZE = 400066;

int n,m;
int v[AI_SIZE];

inline int max ( int a, int b ) { if (a > b) return a; else return b; }
inline int min ( int a, int b ) { if (a < b) return a; else return b; }

void insert ( int cint, int cs, int cd, int s, int d, int val ) {
	if (cs == cd) {
		v[cint] = val;
		return;
	}
	int mid = (cs+cd)/2;
	if (s <= mid) insert(2*cint,cs,mid,s,min(d,mid),val);
	if (d > mid) insert(2*cint+1,mid+1,cd,max(s,mid+1),d,val);
	v[cint] = max(v[2*cint],v[2*cint+1]);
}

int query ( int cint, int cs, int cd, int s, int d ) {
	if (s == cs && d == cd) return v[cint];
	int r = 0;
	int mid = (cs+cd)/2;
	if (s <= mid) r = max(r, query(2*cint,cs,mid,s,min(d,mid)));
	if (d > mid) r = max(r, query(2*cint+1,mid+1,cd,max(s,mid+1),d));
	return r;
}

int main() {
	freopen("arbint.in","rt",stdin);
	freopen("arbint.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 1; i <= n; ++i) {
		int a;
		scanf("%d",&a);
		insert(1,1,n,i,i,a);
	}
	for (int i = 0; i < m; ++i) {
		int cmd,a,b;
		scanf("%d %d %d",&cmd,&a,&b);
		if (cmd == 0) {
			printf("%d\n",query(1,1,n,a,b));
		} else {
			insert(1,1,n,a,a,b);
		}
	}
	return 0;
}