Cod sursa(job #2759397)

Utilizator DariusGhercaDarius Gherca DariusGherca Data 17 iunie 2021 15:52:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N=1<<18;
const int INF=1e9;
int t[N];
int interogare(int p, int st, int dr, int a, int b)
{
    if(a<=st && dr<=b)
    {
        return t[p];
    }

    int m = (st+dr)/2, fs= 2*p, fd= 2*p+1;
    int rs = -INF, rd = -INF;
    if(a<=m)
    {
        rs= interogare(fs,st,m,a,b);
    }
    if(b>= m+1)
    {
        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()
{
    int m,n;
    f>>n>>m;
    for(int i=1; i<=n;i++)
    {
        int aux;
        f>>aux;
        actualizare(1,1,n,i,aux);
    }
    for(int i=0;i< m;i++)
    {
        int tip;
        f>>tip;
        if(tip==0)
        {
            int a,b;
            f>>a>>b;
            g<<interogare(1,1,n,a,b)<<'\n';
        }
        else
        {
            int a,b;
            f>>a>>b;
            actualizare(1,1,n,a,b);
        }
    }
    return 0;
}