Cod sursa(job #1944970)

Utilizator CammieCamelia Lazar Cammie Data 29 martie 2017 12:22:30
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int v[300000], poz, value, a, b, valoare;

inline void coboara(int st, int dr, int nod_curent)
{
    if (poz == st && st == dr) ///cand am gasit pozitia pe care trebuie pus elementul
    {
        v[nod_curent] = valoare;
    }
    else
    {
        int mij = (st + dr) / 2;

        if (poz <= mij) ///daca intervalul in care e cuprins elementul este cel din stanga
        {
            coboara(st, mij, nod_curent * 2);
        }
        else
        {
             coboara(mij + 1, dr, nod_curent * 2 + 1);
        }
        v[nod_curent] = max(v[nod_curent * 2 + 1], v[nod_curent * 2]);
    }
}

inline int ask(int st, int dr, int nod)
{
    if (st >= a && dr <= b)
    {
        return v[nod];
    }
    else
    {
        int r1 = 0, r2 = 0;

        int mij = (st + dr) / 2;

        if (mij >= a)
        {
            r1 = ask(st, mij, nod * 2);
        }
        if (mij < b)
        {
            r2 = ask(mij + 1, dr, nod * 2 + 1);
        }
        return max(r1, r2);
    }
}

inline void Read()
{
    int n, m, cer;
    fin >> n >> m;

    for (int i = 1; i <= n; i++)
    {
        poz = i;
        fin >> valoare;
        coboara(1, n, 1);
    }

    for (int i = 1; i <= m; i++)
    {
        fin >> cer >> a >> b;

        if (cer == 1)
        {
            poz = a; value = b; coboara(1, n, 1);
        }
        else
            fout << ask(1, n, 1) << "\n";
    }
}

int main ()
{
    Read();

    fin.close(); fout.close(); return 0;
}