Cod sursa(job #2934328)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 5 noiembrie 2022 20:49:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <fstream>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>
#define NMAX 100003

using namespace std;

int n,k,val;
int maxim;
int arboreMax[4 * NMAX],v[NMAX];

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

void build(int nod, int st, int dr)
{
	//nod e un indice din arbore
	//st si dr sunt indici din vectorul v
	if (st == dr)
	{
		//am intervalul de lungime 1 1
		arboreMax[nod] = v[st];
	}
	else {
		//parcurg intervalele din stanga si din dreapta ca la mergeSort
		int mij = (st + dr) / 2;
		build(2 * nod, st, mij);
		build(2 * nod + 1, mij + 1, dr);

		//imi iau maximul si il pun pe pozitia nod
		arboreMax[nod] = max(arboreMax[2 * nod], arboreMax[2 * nod + 1]);
	}
}

void query(int nod, int st, int dr, int a, int b)
{
	//nod e un indice din arbore
	//st,dr, a si b sunt indici din vectorul v
	if (a <= st && dr <= b)
	{
		//intervalul meu st dr este inclus frumos in intervalul de query
		maxim = max(maxim, arboreMax[nod]);
	}
	else {
		int mij = (st + dr) / 2;
		if (a<=mij)
		{
			//intervalul de query e la stanga de mijloc
			query(2 * nod, st, mij, a, b);
		}
		if (mij+1<=b)
		{
			//am un interval bun si dupa mijloc
			query(2 * nod + 1, mij + 1, dr, a, b);
		}
	}
}

void update(int nod, int st, int dr, int poz)
{
	if (st == dr)
	{
		//sunt fix in casuta poz
		arboreMax[nod] = val;
	}
	else {
		int mij = (st + dr) / 2;
		//ma uit sa vad pe ce interval il gasesc pe poz
		if (poz <= mij)
		{
			//e in stanga
			update(2*nod, st, mij, poz);
		}
		else {
			//e la dreapta
			update(2 * nod + 1, mij + 1, dr, poz);
		}

		//refac maximul de pe arbore
		arboreMax[nod] = max(arboreMax[2 * nod], arboreMax[2 * nod + 1]);
	}
}

int main()
{
	

	fin >> n>>k;
	for (int i = 1; i <= n; i++)
	{
		fin >> v[i];
	}
	build(1, 1, n);//imi construiesc structura de arbore

	for (int i = 1; i <= k; i++)
	{
		int cerinta;
		fin >> cerinta;
		if (cerinta == 0)
		{
			//se va face query 
			int indSt, indDr;
			maxim = -1;
			fin >> indSt >> indDr;
			query(1, 1, n, indSt, indDr);
			fout << maxim << "\n";
		}
		else {
			//se face update
			int poz;
			fin >> poz>>val;
			v[poz] = val;
			update(1, 1, n, poz);
		}
	}
	return 0;
}