Cod sursa(job #2823666)

Utilizator alextmAlexandru Toma alextm Data 29 decembrie 2021 13:13:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>
using namespace std;

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

class arbint {
	int n;
	vector<int> tree;
	
public:
	arbint(const vector<int> &v) : n(v.size()), tree(n << 1 | 1) {
		copy(begin(v), end(v), begin(tree) + n);
		for(int i = n; i >= 1; i--)
			tree[i] = max(tree[i << 1], tree[i << 1 | 1]);
	}
	
	void update(int pos, int val) {
		tree[pos += n] = val;
		for(pos /= 2; pos >= 1; pos /= 2)
			tree[pos] = max(tree[pos << 1], tree[pos << 1 | 1]);
	}
	
	int query(int st, int dr) {
		int ans = 0;	
		for(st += n, dr += n; st <= dr; st /= 2, dr /= 2) {
			if(st % 2 == 1) ans = max(ans, tree[st++]);
			if(dr % 2 == 0) ans = max(ans, tree[dr--]);
		}
		
		return ans;
	}
};

int main() {
	int n, m;
	fin >> n >> m;
	
	vector<int> v(n + 1);
	for(int i = 1; i <= n; i++)
		fin >> v[i];
		
	arbint aib(v);
	
	while(m--) {
		int t, a, b;
		fin >> t >> a >> b;
		
		if(t == 0)
			fout << aib.query(a, b) << "\n";
		else
			aib.update(a, b);
	}
	
	return 0;
}