Cod sursa(job #2199908)

Utilizator emiemiEmi Necula emiemi Data 29 aprilie 2018 15:37:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int n, i, m, maxi, a, b, c, v[100001];

struct arb {
	arb *stg, *dr;
	int val;
};

arb A;

int max(int a, int b) {
	return ((a > b) ? a : b);
}

void construct(int s, int d, arb *ai) {
	int mij = (s + d) / 2;
	if (s != d) {
		ai->stg = new arb;
		construct(s, mij, ai->stg);
		ai->dr = new arb;
		construct(mij + 1, d, ai->dr);
		ai->val = max(ai->dr->val, ai->stg->val);
	} else {
		ai->val = v[s];
	}
}

void update(int s, int d, arb *ai) {
	if (s == d) {
		ai->val = b;
	} else {
		int mij = (s + d) / 2;
		if (mij >= a)
			update(s, mij, ai->stg);
		else
			update(mij + 1, d, ai->dr);
		ai->val = max(ai->stg->val, ai->dr->val);
	}
}

void query(int s, int d, arb *ai) {
	if (s >= a && d <= b) {
		maxi = max(maxi, ai->val);
		return;
	}
	
	int mij = (s + d) / 2;
	if (a <= mij)
		query(s, mij, ai->stg);
	if (b > mij)
		query(mij + 1, d, ai->dr);
}

int main() {
	f >> n >> m;
	for (i = 1; i <= n; ++i)
		f >> v[i];
	construct(1, n, &A);

	for (i = 1; i <= m; ++i) {
		f >> c >> a >> b;
		if (c == 0) {
			maxi = -1;
			query(1, n, &A);
			g << maxi << '\n';
		} else {
			update(1, n, &A);
		}
	}

	return 0;
}