Cod sursa(job #2759391)

Utilizator codrut86Coculescu Ioan-Codrut codrut86 Data 17 iunie 2021 15:45:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
using namespace std;

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

const int NMAX = 2 << 18, INF = 1e9;
int t[NMAX], n, m, tip, a, b, poz, val;

int interogare(int p, int st, int dr)
{
    if(a <= st && dr <= b) return t[p];

    int mij = (st + dr) / 2, fs = 2*p, fd = 2*p + 1;
    int rs = -INF, rd = -INF;

    if(a <= mij) rs = interogare(fs, st, mij);
    if(b >= mij + 1)  rd = interogare(fd, mij + 1, dr);

    return max(rs, rd);
}

void actualizare(int p, int st, int dr)
{
    if(st == dr) {
        t[p] = val;
        return;
    }

    int mij = (st + dr) / 2, fs = 2*p, fd = 2*p + 1;

    if(poz <= mij){
       actualizare(fs, st, mij);
    }
    else{
       actualizare(fd, mij + 1, dr);
    }
    t[p] = max(t[fs], t[fd]);
}

int main()
{
    in >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        in >> val;
        poz = i;
        actualizare(1, 1, n);
    }

    for(int i = 1; i <= m; i++)
    {
        in >> tip >> a >> b;
        poz = a;
        val = b;

        if(tip == 0)
        {
           out << interogare(1, 1, n) << "\n";
        }
        else
        {
            actualizare(1, 1, n);
        }
    }

    return 0;
}