Cod sursa(job #2490334)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 10 noiembrie 2019 09:56:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int v[100001];
int nod[400003];
const int INF = 1000000001;

void build(int node, int l, int r)
{
    if(l == r)
    {
        nod[node] = v[l];
        return;
    }

    int m = (l+r)/2;
    int ls = node*2, rs = ls+1;

    build(ls, l, m);
    build(rs, m+1, r);

    nod[node] = max(nod[ls], nod[rs]);
}

void update(int node, int l, int r, int poz, int val)
{
    if(l == r)
    {
        nod[node] = val;
        return;
    }

    int m = (l+r)/2;
    int ls = node*2, rs = ls+1;

    if(poz <= m)
        update(ls, l, m, poz, val);
    else
        update(rs, m+1, r, poz, val);

    nod[node] = max(nod[ls], nod[rs]);
}

int query(int node, int l, int r, int ql, int qr)
{
    if(ql <= l && r <= qr)
        return nod[node];

    int m = (l+r)/2;
    int ls = node*2, rs = ls+1;
    int rez = -INF;

    if(ql <= m)
            rez = max(rez, query(ls, l, m, ql, qr));
    if(qr > m)
            rez = max(rez, query(rs, m+1, r, ql, qr));

    return rez;
}

int main()
{
    int n, k;
    in >> n >> k;

    for(int i = 1; i <= n; i++)
        in >> v[i];

    build(1, 1, n);

    for(; k; k--)
    {
        int aux, x, y;
        in >> aux >> x >> y;
        if(aux)
            update(1, 1, n, x, y);
        else
            out << query(1, 1, n, x, y) << '\n';
    }
    return 0;
}