Cod sursa(job #3229530)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 16 mai 2024 14:25:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>

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

const int MAX = 1e5;
int v[MAX + 5], n, q;

class AINT {
private:
	int seg[4 * MAX + 5];
public:
	void build(int poz, int st, int dr) {
		if (st == dr)
			seg[poz] = v[st];
		else {
			int m = (st + dr) / 2;
			build(2 * poz, st, m);
			build(2 * poz + 1, m + 1, dr);
			seg[poz] = std::max(seg[2 * poz], seg[2 * poz + 1]);
		}
	}

	void update(int poz, int x, int p, int st, int dr) {
		if (st == dr)
			seg[poz] = x;
		else {
			int m = (st + dr) / 2;
			if (p <= m)
				update(2 * poz, x, p, st, m);
			else
				update(2 * poz + 1, x, p, m + 1, dr);
			seg[poz] = std::max(seg[2 * poz], seg[2 * poz + 1]);
		}
	}

	int query(int poz, int st, int dr, int query_left, int query_right) {
		if (query_left <= st and dr <= query_right)
			return seg[poz];
		else {
			int m = (st + dr) / 2;
			if (query_right <= m)
				return query(2 * poz, st, m, query_left, query_right);
			if (m < query_left)
				return query(2 * poz + 1, m + 1, dr, query_left, query_right);
			return std::max(query(2 * poz, st, m, query_left, query_right), query(2 * poz + 1, m + 1, dr, query_left, query_right));
		}
	}
};

AINT A;

int main() {
	fin >> n >> q;

	for (int i = 1; i <= n; ++i)
		fin >> v[i];

	A.build(1, 1, n);

	int type, a, b;

	for (; q--;) {
		fin >> type >> a >> b;
		if (type == 0)
			fout << A.query(1, 1, n, a, b) << '\n';
		else
			A.update(1, b, a, 1, n);
	}
}