Cod sursa(job #2803668)

Utilizator lucriLuchian Cristian lucri Data 20 noiembrie 2021 12:25:10
Problema Arbori de intervale Scor 40
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");
int n,m,v,a[100010][55],x,y,z;
int construire(int b,int e,int niv,int q)
{
    if(b>e)
        return 0;
    if(b==e)
    {
        in>>v;
        a[q][niv]=v;
        return a[q][niv];
    }
    a[q][niv]=max(construire(e-(e-b+1)/2+1,e,niv+1,2*q),construire(b,e-(e-b+1)/2,niv+1,2*q-1));
    return a[q][niv];
}
int modificare(int poz,int b,int e,int niv,int q)
{
    if(b==e)
    {
        a[q][niv]=z;
        return a[q][niv];
    }
    if(poz>=e-(e-b+1)/2+1)
        a[q][niv]=max(modificare(poz,e-(e-b+1)/2+1,e,niv+1,2*q),a[2*q-1][niv+1]);
    else
        a[q][niv]=max(modificare(poz,b,e-(e-b+1)/2,niv+1,2*q-1),a[2*q][niv+1]);
    return a[q][niv];
}
int maxim(int bi,int ei,int b,int e,int niv,int q)
{
    if(ei<b||bi>e)
        return 0;
    if(bi<=b&&ei>=e)
        return a[q][niv];
    return max(maxim(bi,ei,b,e-(e-b+1)/2,niv+1,2*q-1),maxim(bi,ei,e-(e-b+1)/2+1,e,niv+1,2*q));
}
int main()
{
    in>>n>>m;
    construire(1,n,1,1);
    for(int i=1;i<=m;++i)
    {
        in>>x>>y>>z;
        if(x==1)
            modificare(y,1,n,1,1);
        else
            out<<maxim(y,z,1,n,1,1)<<'\n';
    }
    return 0;
}