Cod sursa(job #2759401)

Utilizator andreilataretu1Andrei Lataretu andreilataretu1 Data 17 iunie 2021 16:02:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#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;
}