Cod sursa(job #152056)

Utilizator nimicLeoveanu Mihaita Alexandru nimic Data 8 martie 2008 23:25:57
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <algorithm>
#define MaxN 100100
#define BUCKET 512
#define bucket(x) ((x)/BUCKET)
#define first(x) ((x)*BUCKET)

using namespace std;

unsigned n, m;
unsigned val[MaxN], maxBuc[MaxN/BUCKET];

void update(unsigned k, unsigned x){
	unsigned b = bucket(k);
	if (val[k]==maxBuc[b]){
		maxBuc[b] = 0;
		for (unsigned i=first(b); i<first(b+1); i++)
			if (val[i] > maxBuc[b]) maxBuc[b] = val[i];
	}
	val[k] = x;
	if (x>maxBuc[b]) maxBuc[b] = x;
}

void query(unsigned st, unsigned fn){
	unsigned b1 = bucket(st), b2 = bucket(fn);
	unsigned sol = 0;
	for (unsigned i=b1+1; i<b2; i++)
		if (maxBuc[i] > sol) sol = maxBuc[i];
	if (sol < maxBuc[b1])
		for (unsigned i=st; i<first(b1+1) && i<=fn; i++)
			if (val[i] > sol) sol = val[i];
	if (sol < maxBuc[b2])
		for (unsigned i=max(first(b2), st); i<=fn; i++)
			if (val[i] > sol) sol = val[i];
	printf("%u\n", sol);
}

int main(){
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for (unsigned i=0; i<n; i++){
		scanf("%d", val+i);
		if (val[i] > maxBuc[bucket(i)]) maxBuc[bucket(i)] = val[i];
	}
	while (m--){
		unsigned op, a, b;
		scanf("%d %d %d", &op, &a, &b);
		if (op==1) update(a, b);
			else query(a, b);
	}
}