Cod sursa(job #643604)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 3 decembrie 2011 23:45:52
Problema Arbori de intervale Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <cstdio>
#include <vector>

#define MAX_N 1001

using namespace std;

int arb[MAX_N], n, m;

void update(int *arb, int val, int poz, int nod, int s, int d) {

	if(s == d) {
		arb[nod] = val;
		return;
	}

	int mj = (s + d) / 2;

	if(poz <= mj)
		update(arb, val, poz, 2 * nod, s, mj);
	else
		update(arb, val, poz, 2 * nod+ 1, mj + 1, d);

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

void find(int *arb, int nod, int s, int d, int rs, int rd, int *sol) {

	if(s >= rs && d <= rd) {
		if(*sol < arb[nod])
			*sol = arb[nod];
		return;
	}

	int mj = (s + d) / 2;

	if(rs <= mj)
		find(arb, 2 * nod, s, mj, rs, rd, sol);
	if(rd > mj)
		find(arb, 2 * nod + 1, mj + 1, d, rs, rd, sol);
}

int main() {

	FILE *f = fopen("arbint.in", "r");
	FILE *g = fopen("arbint.out", "w");

	int arb[MAX_N], aux, op, a, b, sol;

	fscanf(f, "%d%d", &n, &m);

	for(int i = 1; i <= n; i ++) {
		fscanf(f, "%d", &aux);
		update(arb, aux, i, 1, 1, n);
	}

	for(int i = 1; i <= m; i ++) {
		fscanf(f, "%d%d%d", &op, &a, &b);
		if(op==0) {
			sol=0;
			find(arb, 1, 1, n, a, b, &sol);
			fprintf(g, "%d\n", sol);
		}
		if(op==1)
			update(arb, b, a, 1, 1, n);
	}

	return 0;
}