Cod sursa(job #2661829)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 22 octombrie 2020 19:24:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
//
//  main.cpp
//  arbint
//
//  Created by Eusebiu Rares on 22/10/2020.
//  Copyright © 2020 Eusebiu Rares. All rights reserved.
//

#include <iostream>
#include <fstream>
#include <cmath>

std::fstream in ("arbint.in", std::ios::in) ;
std::fstream out ("arbint.out", std::ios::out) ;

const int NMAX = 1e5 ;

int v[1 + NMAX] ;
int rad[1 + NMAX] ;
int buc[1 + NMAX] ;
int SQRT ;

int maxim(int left, int right) {
	int leftRad = rad[left] ;
	int rightRad = rad[right] ;
	
	if (leftRad == rightRad) {
		int ret(0) ;
		for (int i = left ; i <= right ; ++ i) {
			ret = std::max(ret, v[i]) ;
		}
		return ret ;
	}
	
	int retLeft(0) ;
	for (int i = left ; i <= leftRad * SQRT ; ++ i) {
		retLeft = std::max(retLeft, v[i]) ;
	}
	
	int retRight(0) ;
	for (int i = (rightRad - 1) * SQRT + 1 ; i <= right ; ++ i) {
		retRight = std::max(retRight, v[i]) ;
	}
	
	int ret = std::max(retLeft, retRight) ;
	for (int i = leftRad + 1 ; i <= rightRad - 1 ; ++ i) {
		ret = std::max(ret, buc[i]) ;
	}
	
	return ret ;
}

void change(int position, int value) {
	int respRad = rad[position] ;
	v[position] = value ;
	buc[respRad] = 0 ;
	for (int i = (respRad - 1) * SQRT + 1 ; i <= respRad * SQRT ; ++ i) {
		buc[respRad] = std::max(buc[respRad], v[i]) ;
	}
}

int main(int argc, const char * argv[]) {
	int n, m, type, x, y ;
	in >> n >> m ;
	
	SQRT = sqrt(n) ;
	
	for (int i = 1 ; i <= n ; ++ i) {
		in >> v[i] ;
		rad[i] = 1 ;
	}
	
	for (int i = SQRT + 1 ; i <= n ; ++ i) {
		rad[i] = rad[i - SQRT] + 1 ;
	}
	
	for (int i = 1 ; i <= n ; ++ i) {
		buc[rad[i]] = std::max(buc[rad[i]], v[i]) ;
	}
	
	for (int i = 1 ; i <= m ; ++ i) {
		in >> type >> x >> y ;
		if (type == 0) {
			int ans = maxim(x, y) ;
			out << ans << '\n' ;
		} else {
			change(x, y) ;
		}
	}
}