Cod sursa(job #2292682)

Utilizator epermesterNagy Edward epermester Data 29 noiembrie 2018 20:23:57
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include<fstream>
#include<vector>
#include<math.h>
using namespace std;

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

vector<int> tomb;
vector<int> legnagyobb_Tgy;

int n, m;
int gyok;

void masol(int poz, int ertek) {
	tomb[poz] = ertek;
	if (ertek > legnagyobb_Tgy[poz / gyok]) {
		legnagyobb_Tgy[poz / gyok] = ertek;
	}
	else {
		int kezdet = poz / gyok;
		kezdet *= gyok;
		int vege = kezdet + gyok;
		int max = tomb[kezdet];
		for (int i = kezdet + 1; i < vege; ++i)
			if (tomb[i] > max)
				max = tomb[i];
		legnagyobb_Tgy[poz / gyok] = max;
	}
}

int max(int kp, int vp) {
	int gyok_kezdet, gyok_veg;
	if (kp == (kp / gyok)*gyok)
		gyok_kezdet = kp / gyok;
	else
		gyok_kezdet = kp / gyok + 1;
	
	if (vp + 1 == ((vp + 1) / gyok)*gyok)
		gyok_veg = vp / gyok;				 //
	else
		gyok_veg = vp / gyok - 1;

	int maximum = tomb[kp];
	for (int i = kp; i <= gyok_kezdet * gyok; ++i)
		if (tomb[i] > maximum)
			maximum = tomb[i];
	for (int i = gyok_kezdet; i <= gyok_veg; ++i)
		if (legnagyobb_Tgy[i] > maximum)
			maximum = legnagyobb_Tgy[i];
	for (int i = gyok_veg * gyok + gyok; i <= vp; ++i)
		if (tomb[i] > maximum)
			maximum = tomb[i];

	return maximum;
}

int main() {
	fin >> n >> m;

	gyok = sqrt(n);

	legnagyobb_Tgy.resize(gyok + 1);
	
	for (int i = 0; i < n; ++i) {
		int szam;
		fin >> szam;
		tomb.push_back(szam);
		if (szam > legnagyobb_Tgy[i / gyok])
			legnagyobb_Tgy[i / gyok] = szam;
	}

	for (int i = 0; i < m; ++i) {
		int elso, masodik, harmadik;
		fin >> elso >> masodik >> harmadik;
		masodik--;
		if (elso == 0)
			fout << max(masodik, harmadik - 1) << "\n";
		else
			masol(masodik, harmadik);
	}

	return 0;
}