Cod sursa(job #2273114)

Utilizator livliviLivia Magureanu livlivi Data 31 octombrie 2018 01:56:20
Problema Arbori de intervale Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#define N 100000
#define S 300
using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int batog[N/S+1];
int v[N+1];

void update(int a, int b){
	v[a] = b;
	batog[a / S] = 0;

	for(int i = (a / S) * S; i / S == a / S; i++)
		batog[a / S] = max(batog[a / S], v[i]);
}

int querybat(int a, int b){
	int ans = 0;

	for(int i = a; i < b; i++)
		ans = max(ans, batog[i]);

	return ans;
}

int queryint(int a, int b){
	int ans = 0;

	for(int i = a; i < b; i++)
		ans = max(ans, v[i]);

	return ans;
}

int query(int a, int b){
	if (a / S == b / S) return queryint(a, b + 1);
	return max(queryint(a, (a / S + 1) * S), max(queryint((b / S) * b, b + 1), querybat(a / S + 1, b / S)));
}

int main(){
	int n,m;
	cin>>n>>m;

	for(int i = 0; i < n; i++){
		cin>>v[i];
		batog[i / S] = max(batog[i / S], v[i]);
	}

	for(int i = 0; i < m; i++){
		int op,a,b;
		cin>>op>>a>>b;

		if (op == 0) cout<<query(a - 1, b - 1)<<'\n';
		else update(a - 1, b);
	}

	return 0;
}