Cod sursa(job #2066208)

Utilizator flibiaVisanu Cristian flibia Data 14 noiembrie 2017 19:37:06
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>
	
using namespace std;

int n, m, x, y, cod, h[400100], idx, l, r, nr;

void update(int st, int dr, int pos){
	if(st == dr){
		h[pos] = nr;
		return;
	}
	int mid = (st + dr) / 2;
	if(idx <= mid)
		update(st, mid, 2*pos);
	else 
		update(mid+1, dr, 2*pos+1);
	h[pos] = max(h[2*pos], h[2*pos+1]);
}

int query(int st, int dr, int pos){
	if(l <= st && r >= dr)
		return h[pos];
	int mid = (st + dr) / 2;
	int left = 0, right = 0;
	if(l <= mid)
		left = query(st, mid, 2*pos);
	if(r > mid)
		right = query(mid+1, dr, 2*pos+1);
	return max(left, right);
}

int main(){
	ifstream in("arbint.in");
	ofstream out("arbint.out");
	in >> n >> m;
	for(int i = 1; i <= n; i++){
		in >> nr; 
		idx = i;
		update(1, n, 1);
	}
	for(int i = 1; i <= m; i++){
		in >> cod >> x >> y;
		if(cod){
			idx = x;
			nr = y;
			update(1, n, 1);
		} else{
			l = x;
			r = y;
			out << query(1, n, 1) << '\n';
		}
	}
	return 0;
}