Cod sursa(job #2511586)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 19 decembrie 2019 13:10:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;
long long n,m,aint[400007],in,sf,in2,sf2,nod,val,poz,a,b;
ifstream f("arbint.in");
ofstream g("arbint.out");
///-------------------------------------------
void update(int in, int sf, int nod, int val, int poz)
{
    if(in==sf)
    {
        aint[nod]=val;
        return;
    }
    int mij=(in+sf)/2;
    if(poz<=mij)
    {
        update(in, mij, 2*nod, val, poz);
    }
    else update(mij+1, sf, 2*nod+1, val, poz);
    aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}
///-------------------------------------------
int cauta(int in, int sf, int in2, int sf2, int nod)
{
    if(in==in2 && sf==sf2)
    {
        return aint[nod];
    }
    int mij=(in+sf)/2;
    if(mij<in2)
    {
        return cauta(mij+1,sf,in2, sf2, 2*nod+1);
    }
    if(mij>=sf2)
    {
        return cauta(in,mij,in2,sf2,2*nod);
    }
    if(mij>=in2 && mij<sf2)
    {
        return max(cauta(mij+1,sf,mij+1, sf2, 2*nod+1), cauta(in,mij,in2,mij,2*nod));
    }
}
///-------------------------------------------
int main()
{
    f>>n>>m;
    for(int i=1; i<=n; i++)
    {
        int x;
        f>>x;
        ///in, sf, nod, val, poz;
        update(1,n,1,x,i);
    }
    for(int i=1; i<=m; i++)
    {
        int c,in2,sf2;
        f>>c;
        if(c==1)
        {
            f>>a>>b;
            update(1,n,1,b,a);
        }
        else
        {
            f>>in2>>sf2;
            g<<cauta(1,n,in2,sf2,1)<<"\n";
        }
    }
}