Mai intai trebuie sa te autentifici.

Cod sursa(job #2357154)

Utilizator flibiaVisanu Cristian flibia Data 27 februarie 2019 10:16:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

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

class Aint {
private:
	vector <int> data;
	int sz;
public: 
	void setSize(int dim) {
		sz = dim;
	}
	void init() {
		data.resize(4 * sz + 10);
	}
	void update(int st, int dr, int pos, int id, int val) {
		if (st == dr) {
			data[pos] = val;
			return;
		}
		int mid = (st + dr) / 2;
		if (id <= mid)
			update(st, mid, pos << 1, id, val);
		else update(mid + 1, dr, pos << 1 | 1, id, val);
		data[pos] = max(data[pos << 1], data[pos << 1 | 1]);
	}
	int query(int st, int dr, int pos, int l, int r) {
		if (l <= st && dr <= r)
			return data[pos];
		int mid = (st + dr) / 2;
		int left = 0, right = 0;
		if (l <= mid)
			left = query(st, mid, pos << 1, l, r);
		if (r > mid)
			right = query(mid + 1, dr, pos << 1 | 1, l, r);
		return max(left, right);
	}
};

int main() {
	int n, m, x, y, c;
	Aint v;
	in >> n >> m;
	v.setSize(n);
	v.init();
	for (int i = 1; i <= n; i++) {
		in >> x;
		v.update(1, n, 1, i, x);
	}
	while (m--) {
		in >> c >> x >> y;
		if (c == 0)
			out << v.query(1, n, 1, x, y) << '\n';
		else v.update(1, n, 1, x, y);
	}
	return 0;
}