Cod sursa(job #2422090)

Utilizator copanelTudor Roman copanel Data 17 mai 2019 10:21:38
Problema Arbori de intervale Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>

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

// 2 ^ 18 + 1
int arb[262145];

void update(int p, int st, int dr, int poz, int val) {
	if (st == dr) {
		arb[p] = val;
		return;
	}
	int m = (st + dr) / 2;
	if (poz <= m) {
		update(2*p, st, m, poz, val);
	} else {
		update(2*p+1, m + 1, dr, poz, val);
	}
	arb[p] = MAX(arb[2*p], arb[2*p+1]);
}

int query(int p, int st, int dr, int a, int b) {
	if (a <= st && dr <= b) {
		return arb[p];
	}
	int m = (st + dr) / 2, mst = 0, mdr = 0;
	if (a <= m) {
		mst = query(2 * p, st, m, a, b);
	}
	if (b > m) {
		mdr = query(2 * p + 1, m + 1, dr, a, b);
	}
	return MAX(mst, mdr);
}

int main() {
	FILE *fin = fopen("arbint.in", "r"),
	     *fout = fopen("arbint.out", "w");
	int n, m, e;
	int i, op, a, b;

	fscanf(fin, "%d%d", &n, &m);
	for (i = 0; i < n; i++) {
		fscanf(fin, "%d", &e);
		update(1, 0, n - 1, i, e);
	}

	for (; m > 0; m--) {
		fscanf(fin, "%d%d%d", &op, &a, &b);
		if (op == 0) {
			a--; b--;
			fprintf(fout, "%d\n", query(1, 0, n - 1, a, b));
		} else {
			a--;
			update(1, 0, n - 1, a, b);
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}