Cod sursa(job #2072896)

Utilizator DimaTCDima Trubca DimaTC Data 22 noiembrie 2017 13:44:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<bits/stdc++.h>

using namespace std;


ifstream fin("arbint.in");
ofstream fout("arbint.out");
	
	
unsigned int h[300000], nr , idx, l, r, x, f, n, m;

int maxValue(int a, int b) {
	if (a>b) return a;
	else return b;
}
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, pos*2);
	else update(mid+1, dr, pos*2+1);
	h[pos] = maxValue(h[2*pos], h[2*pos+1]);
}

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


int main() {
	fin>>n>>m;
	for (int i=1; i<=n; i++) {
		fin>>x;
		idx = i; nr = x;
		update(1, n, 1);
	}
	
	for (int i=0; i<m; i++) {
		fin>>f;
		if (f) {
			fin>>idx;
			fin>>nr;
			update(1, n, 1);
		} else {
			fin>>l>>r;
			fout<<query(1, n, 1)<<'\n';
			
		}
	}
	
	return 0;
}