Cod sursa(job #2223306)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 19 iulie 2018 18:10:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");

const int MAXN = 1e5;
const int MAXM = 1e5;

int mx[MAXN << 2];
int n, m;

void update(int node, int le, int ri, int poz, int val) {
	if (le == ri) mx[node] = val;
	else {
		int mid = (le + ri) >> 1;
		if (poz <= mid) update(node << 1, le, mid, poz, val);
		else update((node << 1) + 1, mid + 1, ri, poz, val);
		mx[node] = max(mx[node << 1], mx[(node << 1) + 1]);
	}
}

int query(int node, int le, int ri, int a, int b) {
	if (a <= le && ri <= b) return mx[node];
  int mid = (le + ri) / 2;
  int ri_son = 0, le_son = 0;
  if (mid >= a) le_son = query(node * 2, le, mid, a, b);
  if (mid < b) ri_son = query((node * 2) + 1, mid + 1, ri, a, b);
	return max(le_son, ri_son);
}


int main()
{
	in >> n >> m;
	int nr;
	for (int i = 1; i <= n; ++ i) {
		in >> nr;
		update(1, 1, n, i, nr);
	}

	int t, a, b;
	for (int i = 1; i <= m; ++ i) {
		in >> t >> a >> b;
		if (t) update(1, 1, n, a, b);
		else out << query(1, 1, n, a, b) << '\n';
	}

	return 0;
}