Cod sursa(job #2273232)

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

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

int batog[D+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);

	// if (i == 7){
	// 	cout<<endl;
	// 	cout<<queryint(a, (a / S + 1) * S)<<endl;
	// 	cout<<queryint((b / S) * S, b + 1)<<endl;
	// 	cout<<querybat(a / S + 1, b / S)<<endl;
	// }

	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];
		// v[i] = 500;
		batog[i / S] = max(batog[i / S], v[i]);
	}

	// for(int i = 0; i <= (n - 1) / S; i++)
	// 	cout<<batog[i]<<' ';
	// cout<<endl<<endl;

	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);

			// for(int i = 0; i <= (n - 1) / S; i++)
			// 	cout<<batog[i]<<' ';
			// cout<<endl<<endl;
		}
	}

	return 0;
}