Cod sursa(job #145077)

Utilizator tvladTataranu Vlad tvlad Data 28 februarie 2008 13:02:42
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>

const int N = 32767;

int n, m;
int v[N];

inline int min ( int a, int b ) { return (a < b) ? a : b; }
inline int max ( int a, int b ) { return (a > b) ? a : b; }

void add ( int ci, int cis, int cid, int s, int d, int val ) {
	if (v[ci] < val) v[ci] = val;
	if (s == d) return;
	int m = (cis+cid)/2;
	if (s <= m) add(2*ci,cis,m,s,min(m,d),val);
	if (d > m) add(2*ci+1,m+1,cid,max(m+1,s),d,val);
}

int query ( int ci, int cis, int cid, int s, int d ) {
	if (cis == s && cid == d) return v[ci];
	int r = 0;
	int m = (cis+cid)/2;
	if (s <= m) r = max(r,query(2*ci,cis,m,s,min(m,d)));
	if (d > m) r = max(r,query(2*ci+1,m+1,cid,max(m+1,s),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 x;
		scanf("%d",&x);
		add(1,1,n,i,i,x);
	}
	for (int i = 0; i < m; ++i) {
		int com,a,b;
		scanf("%d %d %d",&com,&a,&b);
		if (com == 0)
			printf("%d\n",query(1,1,n,a,b)); else
			add(1,1,n,a,a,b);
	}
	return 0;
}