Cod sursa(job #2085999)

Utilizator BovisioNitica Ionut Bogdan Bovisio Data 10 decembrie 2017 23:30:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <fstream>

using namespace std;

int n,m,arb[400001];

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

int Maxim(int a,int b)
{
    if(a > b)
        return a;
    return b;
}

void Creare(int Node,int Low,int High,int pos,int Val)
{
    if(Low == High)
    {
        arb[Node] = Val;
    }
    else
    {
        int Mid = (Low+High)/2;
        if(pos <= Mid)
            Creare(2*Node,Low,Mid,pos,Val);
        else
            Creare(2*Node+1,Mid+1,High,pos,Val);
        arb[Node] = Maxim(arb[2*Node] , arb[2*Node+1]);
    }
}

int Querry(int Node,int Low,int High,int qA,int qB)
{
    int Mid,R1=-1,R2=-1;
    if(qA <= Low && High <= qB)
        return arb[Node];
    Mid = (Low+High)/2;
    if(qA <= Mid)
        R1 = Querry(2*Node,Low,Mid,qA,qB);
    if(Mid < qB)
        R2 = Querry(2*Node+1,Mid+1,High,qA,qB);
    return Maxim(R1,R2);
}

void Read()
{
    int cer,a1,b1,aux;
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        f>>aux;
        Creare(1,1,n,i,aux);
    }
    for(int i=1;i<=m;i++)
    {
        f>>cer>>a1>>b1;
        if(cer == 1)
            Creare(1,1,n,a1,b1);
        else
            g<<Querry(1,1,n,a1,b1)<<'\n';
    }
}

int main()
{
    Read();
    return 0;
}