Cod sursa(job #2187226)

Utilizator CiprianC1Ciprian Constantinescu CiprianC1 Data 26 martie 2018 12:20:32
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <algorithm>

using namespace std;

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

void build(int nod, int st, int dr)
{
    int m;
    if(st == dr) aint[nod] = v[st];
    else
    {
        m = (st + dr) / 2;
        build(2 * nod, st, m);
        build(2 * nod + 1, m + 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 m;
    if(st == dr) aint[nod] = val;
    else
    {
        m = (st + dr) / 2;
        if(poz <= m) update(2 * nod, st, m, poz, val);
        if(poz >= m + 1) update(2 * nod + 1, m + 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 m;
    if(st1 <= st and dr <= dr1) sol = max(sol, aint[nod]);
    else
    {
        m = (st + dr) / 2;
        if(st1 <= m) query(2 * nod, st, m, st1, dr1);
        if(dr1 >= m + 1) query(2 * nod + 1, m + 1, dr, st1, dr1);
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int a, b, n, m;
    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 < n; 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;
}