Cod sursa(job #2060194)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 7 noiembrie 2017 22:43:20
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

const int NMax = 1e5 + 5;
int a[NMax];
int interval[NMax];
int length;

void Maxim_Interval(int x, int y)
{
	int maxim = 0;

	for(int i = x/length + 1; i <= y/length - 1; ++i) { // intervalele comune dintre a si b
		if(interval[i] > maxim) {
			maxim = interval[i];
		}
	}

	if(x/length == y/length) { // a si b se afla in acelasi interval
		for(int i = x; i <= y; ++i) {
			if(a[i] > maxim) {
				maxim = a[i];
			}
		}

		g << maxim << '\n';
	}
	else {
		for(int i = x; i/length == x/length; ++i) { // intervalul in care se afla a si nu e comun cu b
			if(a[i] > maxim) {
				maxim = a[i];
			}
		}

		for(int i = y; i/length == y/length; --i) {	//intervalul in care se afla b si nu e comun cu a
			if(a[i] > maxim) {
				maxim = a[i];
			}
		}

		g << maxim << '\n';
	}

}


void Update(int x, int y)
{
	a[x] = y; // elementul de pe pozitia x il facem y si apoi trebuie sa reactualizam maximul din intervalul respectiv

	interval[x/length] = -1;

	for(int i = x/length * length; i < x/length * length + length; ++i) {
		if(a[i] > interval[x/length]) {
			interval[x/length] = a[i];
		}
	}
}

int main()
{
	int n, m;

	f >> n >> m;
	length = (int)sqrt(n);
	for(int i = 1; i <= n; ++i) {
		f >> a[i];
	}

	for(int i = 1; i <= n; ++i) { // contruiesc intervalele
		if(a[i] > interval[i / length]) {
			interval[i / length] = a[i]; // pastrez maximul in intervalul i/length
		}
	}

	for(int i = 1; i <= m; ++i) {
		bool prob;
		int a, b;
		f >> prob;
		f >> a >> b;

		if(prob == 0) {
			Maxim_Interval(a, b);
		}
		else {
			Update(a, b);
		}
	}
	return 0;
}