Cod sursa(job #3123776)

Utilizator Shaan_StefanShaan Stefan Shaan_Stefan Data 25 aprilie 2023 12:07:03
Problema Arbori de intervale Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <tgmath.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, arb[20][100010], c, x, y, lg, i, j, k, lgc;
void reinit(int l, int pos)
{
    if(l>lgc)
        return;
    if(pos-(1<<l)>0)
    {
        arb[l+1][pos-(1<<l)]=max(arb[l][pos], arb[l][pos-(1<<l)]);
        if(arb[l+1][pos-(1<<l)]==arb[l][pos])
            reinit(l+1, pos-(1<<l));
    }
    if(pos+(1<<l)<=n-(1<<l)+1)
    {
        arb[l+1][pos]=max(arb[l][pos], arb[l][pos+(1<<l)]);
        if(arb[l+1][pos]==arb[l][pos])
            reinit(l+1, pos);
    }
}
int main()
{
    fin>>n>>m;
    lgc=int(log2(n));
    for(i=1; i<=n; i++)
    {
        fin>>arb[0][i];
    }
    for(i=1; i<=lgc; i++)
    {
        for(j=1; j<=n-(1<<i)+1; j++)
            arb[i][j]=max(arb[i-1][j], arb[i-1][j+(1<<(i-1))]);
    }

    for(k=1; k<=m; k++)
    {
        fin>>c>>x>>y;
        if(c==0)
        {
            lg=y-x+1;
            fout<<max(arb[int(log2(lg))][x], arb[int(log2(lg))][y-(1<<int(log2(lg)))+1])<<'\n';
        }
        else
        {
            arb[0][x]=y;
            reinit(0, x);
            /*for(i=1; i<=int(log2(n)); i++)
            {
                for(j=1; j<=n-(1<<i)+1; j++)
                    fout<<arb[i][j]<<' ';
                fout<<'\n';
            }*/
        }
    }
    return 0;
}