Cod sursa(job #2454123)

Utilizator StanCatalinStanCatalin StanCatalin Data 7 septembrie 2019 15:06:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>

using namespace std;

const int dim = 100015;

ifstream in("arbint.in");
ofstream out("arbint.out");

int v[dim],n,m,maxi[4*dim],a,b,maxim;

int build(int poz,int st,int dr)
{
    if (st != dr)
    {
        maxi[poz] = max (build(2*poz , st , (st+dr)/2) , build(2*poz+1 , (st+dr)/2 + 1 , dr) );
    }
    else
    {
        maxi[poz] = v[st];
    }
    return maxi[poz];
}

void update(int nod,int st,int dr)
{
    if (st == dr)
    {
        maxi[nod] = b;
        return ;
    }
    if (a <= (st+dr)/2)
    {
        update(2*nod , st , (st+dr)/2);
    }
    else update(2*nod + 1 , (st+dr)/2 + 1 , dr);
    maxi[nod] = max(maxi[2*nod] , maxi[2*nod + 1]);
}

void query(int nod,int st,int dr)
{
    if (a <= st && dr <= b)
    {
        maxim = max(maxim , maxi[nod]);
        return ;
    }
    if (a <= (st+dr)/2) query(2*nod , st, (st+dr)/2);
    if (b > (st+dr)/2) query(2*nod + 1 , (st+dr)/2 + 1, dr);
}

int main()
{
    in >> n >> m;
    int op;
    for (int i=1; i<=n; i++)
    {
        in >> v[i];
    }
    build(1,1,n);
    for (int i=1; i<=m; i++)
    {
        in >> op >> a >> b;
        if (op == 0)
        {
            maxim = -1;
            query(1,1,n);
            out << maxim << "\n";
        }
        else
        {
            update(1,1,n);
        }
    }
    return 0;
}