Cod sursa(job #740014)

Utilizator mihai995mihai995 mihai995 Data 24 aprilie 2012 15:22:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
using namespace std;

const int N = 100005, DAint = 5*N, inf = 0x3f3f3f3f;

int aint[DAint], n, rez_aint;

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

inline int max(int a, int b)
{
    return a > b ? a : b;
}

inline void nod_update(int& T, int st, int dr)
{
    T = max (st, dr);
}

void update(int poz, int st, int dr, int x, int val)
{
    if (st == dr)
    {
        aint[poz] = val;
        return ;
    }

    int m = (st + dr) >> 1, S = poz << 1, D = S + 1;

    if (x <= m)
        update(S, st, m, x, val);
    else
        update(D, m + 1, dr, x, val);

    nod_update(aint[poz], aint[S], aint[D]);
}

void query(int poz, int st, int dr, int x, int y)
{
    if (x <= st && dr <= y)
    {
        nod_update(rez_aint, rez_aint, aint[poz]);
        return ;
    }

    int m = (st + dr) >> 1, S = poz << 1, D = S + 1;

    if (x <= m)
        query (S, st, m, x, y);
    if (m < y)
        query (D, m + 1, dr, x, y);
}

int query (int x, int y)
{
    rez_aint = -inf;
    query (1, 1, n, x, y);
    return rez_aint;
}

int main()
{
    int m, x, y, val;
    in >> n >> m;

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

    while (m--)
    {
        in >> x;

        if (!x)
        {
            in >> x >> y;
            out <<query (x, y)<<"\n";
            continue;
        }

        in >> x >> val;

        update(1, 1, n, x, val);
    }
    return 0;
}