Cod sursa(job #2560466)

Utilizator silviu982001Borsan Silviu silviu982001 Data 28 februarie 2020 01:24:13
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

#define MAX_SIZE 100001

using namespace std;

int n, m, q, poz, x, startPoz, endPoz, result;
int v[4 * MAX_SIZE];

void update(int nod, int left, int right)
{
	if (left == right)
	{
		v[nod] = x;
		return;
	}

	int mij = (left + right) / 2;

	if (poz <= mij)
		update(2 * nod, left, mij);
	else update(2 * nod + 1, mij + 1, right);

	v[nod] = (v[2 * nod] > v[2 * nod + 1]) ? v[2 * nod] : v[2 * nod + 1];
}

void query(int nod, int left, int right)
{
	if (startPoz <= left && endPoz <= right)
	{
		if (result < v[nod])
			result = v[nod];
		return;
	}

	int mij = (left + right) / 2;

	if (startPoz <= mij)
		query(2 * nod, left, mij);

	if (mij < endPoz)
		query(2 * n + 1, mij + 1, right);
}

int main()
{
	int elemAt, value;
	ifstream fin("arbint.in");
	ofstream fout("arbint.out");

	fin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		poz = i;
		fin >> x;
		update(1, 1, n);
	}

	for (int i = 0; i < m; ++i)
	{
		fin >> x >> elemAt >> value;

		if (x == 0)
		{
			result = INT_MIN;

			startPoz = elemAt;
			endPoz = value;

			query(1, startPoz, endPoz);

			fout << result << endl;
		}
		else
		{
			startPoz = elemAt;
			x = value;

			update(1, 1, n);
		}
	}

	fin.close();
	fout.close();

	return 0;
}