Cod sursa(job #2759390)

Utilizator nicoleta_mnMartin nicoleta nicoleta_mn Data 17 iunie 2021 15:43:34
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>

using namespace std;

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()
{
ifstream in("arbint.in");
ofstream out("arbint.out");

int m,n;
in>> n>> m;

for(int i=1; i<=n;i++)
{
    int aux;
    in >> aux;
    actualizare( 1,1,n,i,aux);
}
for(int i=0;i< m;i++)
{
    int tip;
    in>>tip;
    if(tip==0)
    {
        int a,b;
        in >> a>>b;
        out<< interogare(1,1,n,a,b)<<'\n';
    }
    else
    {int a,b;
    in>>a>>b;
    actualizare(1,1,n,a,b);
    }
}
    return 0;
}