Cod sursa(job #2219131)

Utilizator MelacasKorian Ebraahim Melacas Data 7 iulie 2018 13:36:06
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <cstdio>

using namespace std;

void actualizare(int nrNod, int St, int Dr, int stChange, int drChange, int* &arbInt, int valoare)
{
    if (stChange <= St && Dr <= drChange)
        arbInt[nrNod] = valoare;

    else
    {
        int mij = (Dr - St) / 2 + St;
        if (stChange <= mij)
            actualizare(nrNod * 2,St,mij,stChange,drChange,arbInt,valoare);
        if (drChange > mij)
            actualizare(nrNod * 2 + 1,mij+1,Dr,stChange,drChange,arbInt,valoare);

        arbInt[nrNod] = arbInt[nrNod * 2 + 1];
        if (arbInt[nrNod] < arbInt[nrNod * 2])
            arbInt[nrNod] = arbInt[nrNod * 2];
    }
}

int intrebare(int nrNod, int St, int Dr, int stChange, int drChange, int* &arbInt)
{
    if (stChange <= St && Dr <= drChange)
    {
        return arbInt[nrNod];
    }
    else
    {
        int mij = (Dr - St) / 2 + St;
        int a(-1), b(-1);

        if (stChange <= mij)
            a = intrebare(nrNod * 2,St,mij,stChange,drChange,arbInt);
        if (drChange > mij)
            b = intrebare(nrNod * 2 + 1,mij + 1,Dr,stChange,drChange,arbInt);

        if (a < b)
            a = b;

        return a;
    }
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    int* arbInt = new int[257000];
    for (int i = 0 ; i < 257000 ; i++)
        arbInt[i] = -1;

    int n(0), m(0);
    scanf("%d %d\n",&n,&m);

    for (int i = 0 ; i < n ; i++)
    {
        int a(0);
        scanf("%d",&a);

        actualizare(1,1,n,i + 1,i + 1,arbInt,a);
    }

    for (int i = 0 ; i < m ; i++)
    {
        int a(0), b(0);
        scanf("%d",&a);

        if (a == 0)
        {
            scanf("%d %d\n",&a,&b);
            printf("%d\n",intrebare(1,1,n,a,b,arbInt));
        }
        else
        {
            scanf("%d %d\n",&a,&b);
            actualizare(1,1,n,a,a,arbInt,b);
        }
    }
}