Cod sursa(job #1930953)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 19 martie 2017 12:05:44
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstdio>
#include <algorithm>

using namespace std;

class ArboreDeIntervale{
private:
	int sirCitit[100005];
	int sir[400005];
	int n;
	int rezultat;

	void construire(int x, int st, int dr)
	{
		if(st == dr)
		{
			sir[x] = sirCitit[st];
		}
		else
		{	
			int m = (st + dr) / 2;

			construire(x * 2, st, m);
			construire(x * 2 + 1, m + 1, dr);

			sir[x] = max(sir[x * 2], sir[x * 2 + 1]);
		}		
	}

	void querry(int st, int dr, int stx, int drx, int x)
	{
		if(st >= stx && dr <= drx)
		{
			rezultat = max(rezultat, sir[x]);
		}
		else
		{
			int m = (st + dr) / 2;

			if(stx <= m)
			{
				querry(st, m, stx, drx, x * 2);
			}
			if(drx > m)
			{
				querry(m + 1, dr, stx, drx, x * 2 + 1);
			}
		}
	}

	void replace(int st, int dr, int x, int poz, int val)
	{
		if(st == dr)
		{
			sir[x] = val;
		}
		else
		{
			int m = (st + dr) / 2;

			if(poz <= m)
			{
				replace(st, m, x * 2, poz, val);
			}
			else
			{
				replace(m + 1, dr, x * 2 + 1, poz, val);
			}

			sir[x] = max(sir[x * 2], sir[x * 2 + 1]);
		}
	}

public:
	
	void construireArbore(int _n, int _sir[])
	{
		n = _n;

		for(int i = 1; i <= n; i++)
		{
			sirCitit[i] = _sir[i];			
		}

		construire(1, 1, n);
	}

	int gasireElementMaxim(int st, int dr)
	{
		rezultat = 0;
		querry(1, n, st, dr, 1);
		return rezultat;
	}

	void inlocuireValoare(int poz, int val)
	{
		replace(1, n, 1, poz, val);
	}

}arbore;


int main()
{
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);

	int sir[100005];
	int n, m;
	scanf("%d %d", &n, &m);
	
	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &sir[i]);
	}
	
	arbore.construireArbore(n, sir);

	int tmp1, tmp2, tmp3;

	for(int k = 0; k < m; k++)
	{
		scanf("%d %d %d", &tmp1, &tmp2, &tmp3);

		if(tmp1 == 0)
		{
			printf("%d\n", arbore.gasireElementMaxim(tmp2, tmp3));
		}
		else
		{
			arbore.inlocuireValoare(tmp2, tmp3);
		}
	}

	return 0;
}