Cod sursa(job #1758131)

Utilizator calin1Serban Calin calin1 Data 16 septembrie 2016 17:00:59
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <cstdio>
#include <algorithm>
#define N 100005

using namespace std;

int n,m,x,y,vec[N];

class arb
{
private:
    int a[500005],sol;
public:
    arb();
    void set_sol();
    int get_sol();
    void creare(int st, int dr, int poz);
    void cautare(int st, int dr, int poz);
    void update(int st, int dr, int poz);
};

arb::arb()
{
    sol = 0;
}

void arb::set_sol()
{
    sol = 0;
}

int arb::get_sol()
{
    return sol;
}

void arb::creare(int st, int dr, int poz)
{
    if(st == dr)
    {
        a[poz] = vec[st];

        return;
    }

    int mij = (st + dr) >> 1;

    creare(st, mij, poz * 2);

    creare(mij + 1, dr, poz * 2 + 1);

    a[poz] = max(a[poz * 2], a[poz * 2 + 1]);
}

void arb::cautare(int st, int dr, int poz)
{
    if(st <= x && dr <= y)
    {
        sol = max(sol , a[poz]);

        return;
    }

    int mij = (st + dr) >> 1;

    if(mij >= x)
    {
        cautare(st, mij, poz * 2);
    }
    if(mij < y)
    {
        cautare(mij + 1, dr, poz * 2 + 1);
    }
}

void arb::update(int st, int dr, int poz)
{
    if(st == x)
    {
        a[poz] = y;

        return;
    }

    int mij = (st + dr) >> 1;

    if(x <= mij)
    {
        update(st, mij, poz * 2);
    }
    else
    {
        update(mij + 1, dr, poz * 2 + 1);
    }

    a[poz] = max(a[poz * 2], a[poz * 2 + 1]);
}

void citire()
{
    arb arbore;

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

    for(int i = 1 ; i <= n ; ++i)
    {
        scanf("%d ",&vec[i]);
    }
    scanf("\n");

    arbore.creare(1,n,1);

    int tmp;

    for(int i = 1 ; i <= m ; ++i)
    {
        scanf("%d %d %d\n",&tmp,&x,&y);

        if(!tmp)
        {
            arbore.set_sol();

            arbore.cautare(1,n,1);

            printf("%d\n",arbore.get_sol());
        }
        else
        {
            arbore.update(1,n,1);
        }
    }
}

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

    citire();

    return 0;
}