Cod sursa(job #3262976)

Utilizator M132M132 M132 M132 Data 12 decembrie 2024 16:01:44
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100000;
int aint[4*NMAX + 5], v[NMAX + 5];
int n, m;

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

void build(int nod, int l, int r)
{
    if(l != r)
    {
        int m=(l + r)/2;
        build(2*nod, l, m);
        build(2*nod + 1, m + 1, r);
        aint[nod] = max(aint[2*nod], aint[2*nod + 1]);
    }
    else
    {
        ///l = r
        aint[nod] = v[l];
    }
}

void update(int nod, int l, int r, int poz, int elem)
{
    int m = (l + r)/2;
    if(l != r)
    {
        if(m >= poz) ///ma duc in stanga
        {
            update(2*nod, l, m, poz, elem);
            aint[nod] = max(aint[2*nod], aint[2*nod + 1]);
        }
        else
        {
            ///poz >= m + 1, deci ma duc in dreapta
            update(2*nod + 1, m + 1, r, poz, elem);
            aint[nod] = max(aint[2*nod], aint[2*nod + 1]);
        }
    }
    else
    {
        ///l = r
        aint[nod] = elem;
    }
}

int q(int nod, int l, int r, int ql, int qr)
{
    if(l > qr || r < ql || r < l)
    {
        return -1;
    }
    else
    {
        if( ql <= l && ql <= r && qr >= l && qr >= r)
        {
            ///int [l, r] este inclus in [ql, qr]
            return aint[nod];
        }
        else
        {
            int m = (l + r)/2;
            return max(q(2*nod, l, m, ql, qr), q(2*nod + 1, m + 1, r, ql, qr));
        }
    }
}

int main()
{
    int i, a, b, k;
    f >> n >> m;
    for(i = 1; i<= n; ++i)
    {
        f >> v[i];
    }
    build(1, 1, n);
    for(i = 1; i <= m; ++i)
    {
        f >> k >> a >> b;
        if(k == 0)
        {
            g << q(1, 1, n, a, b) << "\n";
        }
        else
        {
            ///k = 1
            update(1, 1, n, a, b);
        }
    }
    return 0;
}