Cod sursa(job #1770259)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 3 octombrie 2016 22:36:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <bits/stdc++.h>
using namespace std;

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

int main(){
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	int n, m;
	f >> n >> m;
	vector<int> v(n);
	for(auto& x : v){
		f >> x; }

	arbint arb(v);

	for(int t, a, b; m--; ){
		f >> t >> a >> b;
		if(t == 0) g << arb.query(a-1, b-1) << '\n';
		else arb.update(a-1, b); }

	return 0; }