Cod sursa(job #2187268)

Utilizator CiprianC1Ciprian Constantinescu CiprianC1 Data 26 martie 2018 12:45:41
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int v[100005], aint[400005], sol, m;

void build(int nod, int st, int dr)
{
    int med;
    if(st == dr) aint[nod] = v[st];
    else
    {
        med = (st + dr) / 2;
        build(2 * nod, st, med);
        build(2 * nod + 1, med + 1, dr);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }
}

void update(int nod, int st, int dr, int poz, int val)
{
    int med;
    if(st == dr) aint[nod] = val;
    else
    {
        med = (st + dr) / 2;
        if(poz <= med) update(2 * nod, st, med, poz, val);
        if(poz >= med + 1) update(2 * nod + 1, med + 1, dr, poz, val);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }
}

void query(int nod, int st, int dr, int st1, int dr1)
{
    int med;
    if(st1 <= st and dr <= dr1) sol = max(sol, aint[nod]);
    else
    {
        med = (st + dr) / 2;
        if(st1 <= med) query(2 * nod, st, med, st1, dr1);
        if(dr1 >= med + 1) query(2 * nod + 1, med + 1, dr, st1, dr1);
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int a, b, n;
    bool t;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &v[i]);
    }
    build(1, 1, n);
    for(int i = 0; i < m; i++)
    {
        scanf("%d%d%d", &t, &a, &b);
        if(!t)
        {
            sol = 0;
            query(1, 1, n, a, b);
            printf("%d\n", sol);
        }
        if(t) update(1, 1, n, a, b);
    }
    return 0;
}