Cod sursa(job #2954532)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 14 decembrie 2022 18:51:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>

using namespace std;

const int NMAX = 100000;

int v[1 + NMAX];

int aint[1 + 4 * NMAX];

void buildAint(int index, int st, int dr)
{
    if (st == dr)
    {
        aint[index] = v[st];///= v[dr];

        return;
    }

    int mij = (st + dr) / 2;

    int fiuSt = 2 * index;
    int fiuDr = 2 * index + 1;

    buildAint(fiuSt, st, mij);
    buildAint(fiuDr, mij + 1, dr);

    aint[index] = max(aint[fiuSt], aint[fiuDr]);
}

void updateAint(int index, int st, int dr, int poz, int val)
{
    if (st == dr)
    {
        aint[index] = val;

        return;
    }

    int mij = (st + dr) / 2;

    int fiuSt = 2 * index;
    int fiuDr = 2 * index + 1;

    if (poz <= mij)
        updateAint(fiuSt, st, mij, poz, val);
    else
        updateAint(fiuDr, mij + 1, dr, poz, val);

    aint[index] = max(aint[fiuSt], aint[fiuDr]);
}

int queryAint(int index, int st, int dr, int stQ, int drQ)
{
    if (st == stQ && drQ == dr)
        return aint[index];

    int mij = (st + dr) / 2;

    int fiuSt = 2 * index;
    int fiuDr = 2 * index + 1;

    if (drQ <= mij)
        return queryAint(fiuSt, st, mij, stQ, drQ);
    else if (mij + 1 <= stQ)
        return queryAint(fiuDr, mij + 1, dr, stQ, drQ);
    else
        return max(queryAint(fiuSt, st, mij, stQ, mij), queryAint(fiuDr, mij + 1, dr, mij + 1, drQ));
}

int main()
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");

    int n, m;
    in >> n >> m;

    for (int i = 1; i <= n; i++)
        in >> v[i];

    buildAint(1, 1, n);

    for (int j = 1; j <= m; j++)
    {
        int tip, a, b;
        in >> tip >> a >> b;

        if (tip == 0)
            out << queryAint(1, 1, n, a, b) << '\n';
        else
            updateAint(1, 1, n, a, b);
    }

    in.close();
    out.close();

    return 0;
}