Cod sursa(job #1758124)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 16 septembrie 2016 16:50:16
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int numere[100000];

class ArboreDeIntervale
{
public:
    int arbore[400000];
    int sol;

    arboreDeIntervale()
    {
        sol = 0;
    }

    int getSol()
    {
        return sol;
    }

    void setSol(int x)
    {
        sol = x;
    }

    void construire(int k, int st, int dr)
    {
        if(st == dr)
        {
            arbore[k] = numere[st];
        }
        else
        {
            int mij = (st + dr) / 2;

            construire(2 * k, st, mij);
            construire(2 * k + 1, mij + 1, dr);

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

    void inlocuire(int st, int dr , int pos, int valoare, int k)
    {
        if(st == dr)
        {
            arbore[k] = valoare;
        }
        else
        {
            int mij = (st + dr) / 2;

            if(pos <= mij)
            {
                inlocuire(st, mij, pos, valoare, 2 * k);
            }
            else
            {
                inlocuire(mij + 1, dr, pos, valoare, 2 * k + 1);
            }

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

    void maximInterval(int st, int dr, int stx, int drx, int k)
    {
        if(stx >= st && drx <= dr)
        {
            sol = max(sol, arbore[k]);
        }
        else
        {
            int mij = (stx + drx) / 2;

            if(st <= mij)
            {
                maximInterval(st, dr, stx, mij, k * 2);
            }
            if(dr > mij)
            {
                maximInterval(st, dr, mij + 1, drx, k * 2 + 1);
            }
        }
    }
};

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

    int n, m;
    ArboreDeIntervale arb;

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

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

    arb.construire(1, 0, n - 1);

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

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

        if(tmp1 == 0)
        {
            arb.setSol(0);
            arb.maximInterval(tmp2 - 1, tmp3 - 1, 0, n - 1, 1);
            printf("%d\n", arb.getSol());
        }
        else
        {
            arb.inlocuire(0, n - 1, tmp2 - 1, tmp3, 1);
        }
    }

    return 0;
}