Cod sursa(job #2984986)

Utilizator BeneIonut2208Bene Ionut-Matei BeneIonut2208 Data 25 februarie 2023 13:46:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int arbore[400005], v[100005];
int n, m;

void construire(int k, int st, int dr)
{
    if(st == dr)
        arbore[k] = v[st];
    else
    {
        int mij = (st + dr) / 2;
        construire(2 * k, st, mij);
        construire(2 * k + 1, mij + 1, dr);
        arbore[k] = max(arbore[2 * k], arbore[2 * k + 1]);
    }
}

int get_maxim(int k, int a, int b, int st, int dr)
{
    if(st >= a && dr <= b)
        return arbore[k];
    if(dr < a || st > b)
        return -1;
    int mij = (st + dr) / 2;
    return max(get_maxim(2 * k, a, b, st, mij), get_maxim(2 * k + 1, a, b, mij + 1, dr));

}

void schimba_val(int k, int a, int b, int st, int dr)
{
    if(st == dr)
        arbore[k] = b;
    else
    {
        int mij = (st + dr) / 2;
        if(a <= mij)
            schimba_val(2 * k, a, b, st, mij);
        else
            schimba_val(2 * k + 1, a, b, mij + 1, dr);
        arbore[k] = max(arbore[2 * k], arbore[2 * k + 1]);
    }

}

int main()
{
    fin >> n >> m;
    for(int i = 1; i <= n; i++)
        fin >> v[i];
    construire(1, 1, n);
    for(int i = 1; i <= m; i++)
    {
        int q, a, b;
        fin >> q >> a >> b;
        if(q == 0)
            fout << get_maxim(1, a, b, 1, n) << '\n';
        else
            schimba_val(1, a, b, 1, n);
    }
    return 0;
}