Cod sursa(job #613089)

Utilizator TeodoraTanaseTeodora Tanase TeodoraTanase Data 15 septembrie 2011 18:51:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <cstdio>
#include <algorithm>
#define N 100000

using namespace std;

int n, m, s[N], h[4*N], x, a, b, rez;

void citire()
{
    scanf ("%d %d ", &n, &m);
    for (int i = 1; i <= n; ++ i)
        scanf ("%d ", &s[i]);
}

void pune(int st, int dr, int nod)
{
    if (st == dr)
    {
        h[nod] = s[st];
        return;
    }
    int mij = (st + dr) >> 1, unde = (nod << 1);
    pune (st, mij, unde);
    pune (mij + 1, dr, unde +1);
    h[nod] = max (h[unde], h[unde + 1]);
}

void maxim(int st, int dr, int nod)
{
    if (a <= st && b >= dr)
    {
        rez = max (rez, h[nod]);
        return;
    }
    if (st == dr)
        return;
    int mij = (st + dr) >> 1, unde = (nod << 1);
    maxim (st, mij, unde);
    maxim (mij + 1, dr, unde + 1);
    h[nod] = max (h[unde], h[unde + 1]);
}

void modif(int st, int dr, int nod)
{
    if (st == dr)
    {
        if (st == a)
            h[nod] = b;
        return;
    }
    int mij = (st + dr) >> 1, unde = (nod << 1);
    modif (st, mij, unde);
    modif (mij + 1, dr, unde + 1);
    h[nod] = max (h[unde], h[unde + 1]);
}

void continua()
{
    for (int i = 1; i <= m; ++ i)
    {
        scanf ("%d %d %d ", &x, &a, &b);
        if (x == 0)
        {
            rez = 0;
            maxim(1, n, 1);
            printf ("%d\n", rez);
        }
        else
            modif(1, n, 1);
    }
}

int main()
{
    freopen ("arbint.in", "r", stdin);
    ///freopen ("arbint.out", "w", stdout);
    citire();
    pune(1, n, 1);
    continua();
    return 0;
}