Cod sursa(job #2497926)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 23 noiembrie 2019 12:29:07
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m;
int arb[410000];

int dep(int p, int st = 1, int en = n){
	int m = (st+en)/2;
	if(st == en){
		return 1;
	}else if(p >= st && p <= m){
		return 2*dep(p, st, m);
	}else if(p >= m+1 && p <= en){
		return 2*dep(p, m+1, en)+1;
	}
}

void rep(int p, int a){
	int d = dep(p);
	arb[d] = a;
	for(int i = d/2; i >= 1; i /= 2){
		arb[i] = max(arb[i*2], arb[i*2+1]);
	}
}

int cal(int a, int b, int p = 1, int st = 1, int en = n){
	if(st == a && en == b){
		return arb[st];
	}
	int m = (st+en)/2;
	if(a >= st && a <= m){
		if(b <= m){
			return cal(a, b, 2*p, st, m);
		}else{
			return max(cal(a, m, 2*p, st, m), cal(m+1, b, 2*p+1, m+1, en));
		}
	}else{
		return cal(a, b, 2*p+1, m+1, en);
	}
}

int main(){
	fin >> n >> m;
	for(int i = 1; i <= n; i++){
		int a;fin >> a;
		rep(i, a);
	}
	
	for(int i = 0; i < m; ++i){
		int op, a, b;
		fin >> op >> a >> b;
		if(op == 0){
			fout << cal(a, b) << "\n";
		}else{
			rep(a, b);
		}
	}
	
	return 0;
}