Cod sursa(job #2097590)

Utilizator zvonTutuldunsa Voronokda zvon Data 31 decembrie 2017 20:57:06
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <stdlib.h>

int N, M;
int A[100005];
int B[400040];

int build(int l, int r, int idb) {
	int m;
	int a, b;
	m = (l + r) / 2;
	if (l == r) {
		B[idb] = A[l];
		return B[idb];
	}
	a = build(l, m, idb * 2);
	b = build(m + 1, r, idb * 2 + 1);
	B[idb] = (a > b ? a : b);
	return B[idb];
}

int maxint(int a, int b, int id, int l, int r) {
	int m, x = -1, y = -1;
	m = (a + b) / 2;
	if (a >= l && b <= r)
		return B[id];
	if (l <= m)
		x = maxint(a, m, id * 2, l, r);
	if (r > m)
		y = maxint(m + 1, b, id * 2 + 1, l, r);
	return (x > y ? x : y);
}

int change(int l, int r, int ida, int idb, int val) {
	int m, x, y;
	m = (l + r) / 2;
	if (l == r) {
		A[ida] = val;
		B[idb] = val;
		return val;
	}
	if (ida <= m) {
		x = change(l, m, ida, 2 * idb, val);
		y = B[2 * idb + 1];
		B[idb] = (x > y ? x : y);
		return B[idb];
	}
	x = change(m + 1, r, ida, 2 * idb + 1, val);
	y = B[2 * idb];
	B[idb] = (x > y ? x : y);
	return B[idb];
}

int main() {
	FILE *fi;
	FILE *fo;
	int i, op, a, b;
	fi = fopen("arbint.in", "r");
	fo = fopen("arbint.out", "w");
	fscanf(fi, "%d%d", &N, &M);
	for (i = 1; i <= N; i++) {
		fscanf(fi, "%d", &A[i]);
	}
	build(1, N, 1);
	for (i = 1; i <= M; i++) {
		fscanf(fi, "%d%d%d", &op, &a, &b);
		if (op == 0) {
			fprintf(fo, "%d\n", maxint(1, N, 1, a, b));
		} else {
			change(1, N, a, 1, b);
		}
	}
	
	fclose(fi);
	fclose(fo);
	return 0;
}