Cod sursa(job #2759388)

Utilizator BogdanFarcasBogdan Farcas BogdanFarcas Data 17 iunie 2021 15:38:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>

using namespace std;

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

const int N = 1<<18;

int t[N];
int n, m, x, task, a, b;

int interogare(int p, int st, int dr, int a, int b) ///returneaza max([st, dr] intersectat cu [a,b])
{
    if(a<=st && dr<=b)
    {
        return t[p];
    }
    int m = (st+dr)/2, fs = 2*p, fd = 2*p+1;
    int rs = -1, rd = -1;
    if(a <= m)
    {
        rs = interogare(fs, st, m, a, b);
    }
    if(b > m)
    {
        rd = interogare(fd, m+1, dr, a, b);
    }
    return max(rs,rd);
}

void actualizare(int p, int st, int dr, int poz, int val)
{
    if(st == dr)
    {
        t[p] = val;
        return;
    }
    int m = (st+dr)/2, fs= 2*p, fd = 2*p+1;
    if(poz <= m)
    {
        actualizare(fs, st, m, poz, val);
    }
    else
    {
        actualizare(fd, m+1, dr, poz, val);
    }
    t[p] = max(t[fs], t[fd]);
}

int main()
{
    cin>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        cin>>x;
        actualizare(1, 1, n, i, x);
    }
    for(int i = 1; i <= m; i++)
    {
        cin>>task>>a>>b;
        if(task == 0)
        {
            cout<<interogare(1, 1, n, a, b)<<'\n';
        }
        else
        {
            actualizare(1, 1, n, a, b);
        }
    }
    return 0;
}