Cod sursa(job #150858)

Utilizator scvalexAlexandru Scvortov scvalex Data 7 martie 2008 15:27:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <cstdio>
#include <fstream>

using namespace std;

const int dim = 100001;

int N,
	M;
int arb[4*dim+66];
int val,
	pos,
	p,
	r,
	maxim;

#define MAX(a, b) ((a > b) ? (a) : (b))

void update(int nod, int left, int right) {
	if (left == right) {
		arb[nod] = val;
		return;
	}

	int q = (left+right)/2;
	if (pos <= q)
		update(2*nod, left, q);
	else
		update(2*nod+1, q+1, right);

	arb[nod] = MAX(arb[2*nod], arb[2*nod+1]);
}

void query(int nod, int left, int right) {
	if ((p <= left) && (right <= r)) {
		if (maxim < arb[nod])
			maxim = arb[nod];
		return;
	}

	int q = (left + right) / 2;
	if (p <= q)
		query(2*nod, left, q);
	if (q < r)
		query(2*nod+1, q+1, right);
}

int main(int argc, char *argv[]) {
	FILE *fi = fopen("arbint.in", "r");
	fscanf(fi, "%d %d", &N, &M);
	int aux;
	for (int i(1); i <= N; ++i) {
		fscanf(fi, "%d", &aux);
		pos = i;
		val = aux;
		update(1, 1, N);
	}

	int a, b;
	FILE *fo = fopen("arbint.out", "w");
	for (int i(0); i < M; ++i) {
		fscanf(fi, "%d %d %d", &aux, &a, &b);
		if (aux == 0) {
			maxim = -1;
			p = a;
			r = b;
			query(1, 1, N);

			fprintf(fo, "%d\n", maxim);
		} else {
			pos = a;
			val = b;
			update(1, 1, N);
		}
	}
	fclose(fo);
	fclose(fi);

	return 0;
}