Cod sursa(job #1389366)

Utilizator cosmin.pascaruPascaru Cosmin cosmin.pascaru Data 16 martie 2015 10:49:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>

#define NMAX 100005
using namespace std;

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

int arb[NMAX << 2];

void update(int st, int dr, int nod, int a, int b);
int query(int st, int dr, int nod, int a, int b);

int main()
{
    int n, m;
    int a, b;
    int c;
    fin >> n >> m;

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

    for (; m; --m)
    {
        fin >> c >> a >> b;
        if (c == 0) fout << query(1, n, 1, a, b) << '\n';
        else update(1, n, 1, a, b);
    }
    return 0;
}
void update(int st, int dr, int nod, int a, int b)
{
    if (st >= dr)
    {
        arb[nod] = b;
        return;
    }

    int mij = st + ((dr - st) >> 1);
    if (a <= mij) update(st, mij, nod << 1, a, b);
    else update(mij + 1, dr, (nod << 1) + 1, a, b);

    arb[nod] = max (arb[nod << 1], arb[(nod << 1) + 1]);
}
int query(int st, int dr, int nod, int a, int b)
{
    if (a <= st && dr <= b) return arb[nod];

    int m1 = 0, m2 = 0, mij = st + ((dr - st) >> 1);
    if (a <= mij) m1 = query(st, mij, nod << 1, a, b);
    if (b > mij) m2 = query(mij + 1, dr, (nod << 1) + 1, a, b);

    return max(m1, m2);
}