Cod sursa(job #1870729)

Utilizator ancabdBadiu Anca ancabd Data 6 februarie 2017 21:06:06
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>

using namespace std;

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

#define NMAX 400001

int n, m, mx, a[NMAX];

void add(int nod, int st, int dr, int pos, int val)
{
    if (dr == st)
    {
        a[nod] = val;
        return;
    }
    int mijl = (st + dr)/2;

    if (pos <= mijl)add (2 * nod, st, mijl, pos, val);
    else add(2 * nod + 1, mijl + 1, dr, pos, val);

    a[nod] = max(a[2 * nod], a[2 * nod + 1]);
}

void query(int nod, int st, int dr, int inc, int fnl)
{
    if (st >= inc && dr <= fnl)
    {
        mx = max(mx, a[nod]);
        return;
    }

    int mijl = (st + dr)/2;

    if(mijl >= inc)query(2 * nod, st, mijl, inc, fnl);
    if (mijl < fnl)query(2 * nod + 1, mijl + 1, dr, inc, fnl);
}
int main()
{
    int x, y, c;

    fin >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        fin >> x;
        add(1, 1, n, i, x);
    }

    for (int i = 1; i <= m; i++)
    {
        fin >> c >> x >> y;
        if (c == 1)add(1, 1, n, x, y);
        else
        {
            mx = -1;
            query(1, 1, n, x, y);
            fout << mx << '\n';
        }
    }
    return 0;
}