Cod sursa(job #2755827)

Utilizator andi2000Toader Andi andi2000 Data 28 mai 2021 14:35:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

int arbore[400010];
int n, m, start, finish, val, pos, maxim, x, a, b;

inline int maxxim(int a, int b)
{
    if (a > b) return a;
    return b;
}

void quer(int nod, int stanga, int dreapta)
{
    if(start <= stanga && dreapta <= finish)
    {
        if(maxim < arbore[nod])
            maxim = arbore[nod];
        return;
    }

    int mij = (stanga + dreapta) / 2;
    if(start <= mij)
    {
        quer(2 * nod, stanga, mij);
    }
    if(mij < finish)
    {
        quer(2 * nod + 1, mij + 1, dreapta);
    }
}

void update(int nod, int stanga, int dreapta)
{
    if(stanga == dreapta)
    {
        arbore[nod] = val;
        return;
    }
    int mij = (stanga + dreapta) / 2;
    if(pos <= mij)
    {
        update(2 * nod, stanga, mij);
    }
    else
    {
        update(2 * nod + 1, mij + 1, dreapta);
    }
    arbore[nod] = maxxim(arbore[2 * nod], arbore[2 * nod + 1]);
}

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

    f >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        f >> x;
        pos = i;
        val = x;
        update(1, 1, n);
    }

    for(int i = 1; i <= m; i++)
    {
        f >> x >> a >> b;
        if(x == 0)
        {
            maxim = -1;
            start = a, finish = b;
            quer(1, 1, n);

            g << maxim << '\n';
        }
        else
        {
            pos = a, val = b;
            update(1, 1, n);
        }
    }
    f.close();
    g.close();
    return 0;
}