Cod sursa(job #3332973)

Utilizator matiasmatias matias Data 10 ianuarie 2026 11:11:53
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;
ofstream fout("arbint.out");
ifstream fin("arbint.in");

vector<int>a, maxarbor;
int n, m;
int val, poz, maxim, start, finish;
struct intr {
	int type;
	int a;
	int b;

};

vector<intr> que;



int maximus(int v1, int v2) {
	if (v1 > v2) return v1;
	else return v2;
}


void query(int i, int l, int r) {
	if (start <= l && finish >= r) {
		if (maxim < maxarbor[i]) {
			maxim = maxarbor[i];
		}

		return;
	}

	int m = (l + r) / 2;
	if (start <= m) query(2 * i, l, m);
	if (m < finish) query(2 * i + 1, m + 1, r);

}


void update(int i, int l, int r) {
	if (l == r) {
		maxarbor[i] = val;
		return;
	}

	int m = (l + r) / 2;
	if (poz <= m) {
		update(2 * i, l, m);
	}
	else if (poz > m) {
		update(2 * i + 1, m + 1, r);
	}

	maxarbor[i] = maximus(maxarbor[2 * i], maxarbor[2 * i + 1]);

}


void citire() {

	fin >> n >> m;
	a = vector<int>(n + 1);
	maxarbor = vector<int>(4 * n + 66);

	que = vector<intr>(m + 1);
	for (int i = 1; i <= n; i++) {
		fin >> a[i];
		poz = i;
		val = a[i];

		update(1, 1, n);
	}
	for (int i = 1; i <= m; i++) {
		fin >> que[i].type;
		fin >> que[i].a;
		fin >> que[i].b;
	}
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(nullptr);

	citire();

	for (int i = 1; i <= m; i++) {
		if (que[i].type == 0) {
			maxim = -1;
			start = que[i].a;
			finish = que[i].b;
			query(1, 1, n);
			fout << maxim << endl;

		}
		else {
			poz = que[i].a;
			val = que[i].b;
			update(1, 1, n);

		}

	}


	fin.close();
	fout.close();


}