Cod sursa(job #2908327)

Utilizator LIR16LazarIonutRadu LIR16 Data 2 iunie 2022 21:31:41
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

#ifndef DLOCAL
	#define cin fin
	#define cout fout
	ifstream cin("arbint.in");
	ofstream cout("arbint.out");
#endif

const int nmax = 1e5 + 5;

int n;

namespace AINT {
	int aint[nmax * 4];
	void construct(int *v, int node = 1, int cl = 1, int cr = n) {
		if(cl == cr) {
			aint[node] = v[cl];
			return;
		}
		int mid = cl + cr >> 1;
		construct(v, node * 2, cl, mid);
		construct(v, node * 2 + 1, mid + 1, cr);
		aint[node] = max(aint[2 * node], aint[2 * node + 1]);
	}
	void upd(int poz, int val, int node = 1, int cl = 1, int cr = n) {
		if(cl == cr) {
			aint[node] = val;
			return;
		}
		int mid = cl + cr >> 1;
		if(poz <= mid)
			upd(poz, val, node * 2, cl, mid);
		else
			upd(poz, val, 2 * node + 1, mid + 1, cr);
		aint[node] = max(aint[2 * node], aint[2 * node + 1]);
	}
	int query(int l, int r, int node = 1, int cl = 1, int cr = n) {
		if(r < cl || cr < l)
			return 0;
		if(l <= cl && cr <= r)
			return aint[node];
		int mid = cl + cr >> 1;
		return max(query(l, r, 2 * node, cl, mid), query(l, r, 2 * node + 1, mid + 1, cr));
	}
};

int v[nmax];

int main() {
	int q;
	cin >> n >> q;
	for(int i = 1; i <= n; i++)
		cin >> v[i];
	AINT::construct(v);
	for(int i = 0, t, l, r; i < q; i++) {
		cin >> t >> l >> r;
		if(t == 0)
			cout << AINT::query(l, r) << '\n';
		else
			AINT::upd(l, r);
	}
	return 0;
}