Cod sursa(job #1930167)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 18 martie 2017 16:07:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;

int m;

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

    void construire(int x, int st, int dr)
    {
        if(st == dr)
        {
        	sir[x] = sirCitit[st];
        	return;
        }

        int m = (st + dr) / 2;

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

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

    void querry(int x, int st, int dr, int a, int b)
	{
		if(st >= a && dr <= b)
		{
			val = max(val, sir[x]);
			return;
		}

		int m = (st + dr) / 2;

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

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

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

		construire(1, 1, n);
    }

    int cautare(int st, int dr)
    {
        val = 0;
        querry(1, 1, n, st, dr);
        return val;
    }

	void update(int x, int nodCautat, int st, int dr, int valoare)
	{
		if(st == dr)
		{
			sir[x] = valoare;
			return;
		}

        int m = (st + dr) / 2;

		if(nodCautat <= m)
		{
			update(x * 2, nodCautat, st, m, valoare);
		}
		else
		{
			update(x * 2 + 1, nodCautat, m + 1, dr, valoare);
		}

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

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

	int n;
	int sirxx[100005];

	scanf("%d %d", &n, &m);

	for(int i = 1; i <= n; i++)
	{
		scanf("%d", &sirxx[i]);
	}

	arbore.construireArbore(sirxx, n);

	for(int i = 0; i < m; i++)
	{
		int tmp1, tmp2, tmp3;

		scanf("%d %d %d", &tmp1, &tmp2, &tmp3);

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

    return 0;
}