Cod sursa(job #1688797)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 13 aprilie 2016 18:55:04
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
int numere[100000];
int operatie, a, b;

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

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

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

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

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

            if(stx <= mij)
            {
                maximInterval(st, mij, stx, drx, k * 2);
            }
            if(drx > mij)
            {
                maximInterval(mij + 1, dr, stx, drx, k * 2 + 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, k * 2);
            }
            else
            {
                inlocuire(mij + 1, dr, pos, valoare, k * 2 + 1);
            }

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

};

void citire()
{
    scanf("%d %d", &n, &m);

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

void citireLinie()
{
    scanf("%d %d %d", &operatie, &a, &b);
}

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

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

    for(int i = 0; i < m; i++)
    {
        citireLinie();

        if(operatie == 0)
        {
            arb.solutie = 0;
            arb.maximInterval(0, n - 1, a - 1, b - 1, 1);
            printf("%d\n", arb.solutie);

        }
        else if(operatie == 1)
        {
            arb.inlocuire(0, n - 1, a - 1, b, 1);
        }
    }

    return 0;
}