Cod sursa(job #3173394)

Utilizator MegaCoderMinoiu Teodor Mihai MegaCoder Data 22 noiembrie 2023 19:38:23
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
int n, m;
int arbint[400001];
void update(int val, int index, int st, int dr, int pos)
{
    if(st==dr)
    {
        arbint[pos]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(index>mij)
        update(val, index, mij+1, dr, 2*pos+1);
    else
       update(val, index, st, mij, 2*pos);
    arbint[pos]=std::max(arbint[2*pos], arbint[2*pos+1]);
}
bool commonPart(int st, int dr, int start, int stop)
{
    if(st>=start && st<=stop)
        return true;
    if(dr>=start && dr<=stop)
        return true;
    return false;
}
void query(int start, int stop, int st, int dr, int pos, int &max)
{
    if(st>=start && dr<=stop)
    {
        max=std::max(arbint[pos], max);
        return;
    }
    int mij=(st+dr)/2;
    if(commonPart(st, mij, start, stop))
        query(start, stop, st, mij, 2*pos, max);
    if(commonPart(mij+1, dr, start, stop))
        query(start, stop, mij+1, dr, 2*pos+1, max);
}
void solve()
{
    fin>>n>>m;
    for(int index=1; index<=n; ++index)
    {
        int val;
        fin>>val;
        update(val, index, 1, n, 1);
    }
    for(int index=0; index<m; ++index)
    {
        int q;
        fin>>q;
        if(!q)
        {
            int a, b;
            fin>>a>>b;
            int max=-1;
            query(a, b, 1, n, 1, max);
            fout<<max<<'\n';
        }
        else
        {
            int i, val;
            fin>>i>>val;
            update(val, i, 1, n, 1);
        }
    }
}
int main()
{
    solve();
    fin.close();
    fout.close();
    return 0;
}


/*11 3
4 6 2 5 1 3 8 9 1 2 3
*/