Cod sursa(job #1389974)

Utilizator Arodoet96Teodora Stoleru Arodoet96 Data 16 martie 2015 19:14:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#define DMAX 100004

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n, m;
int A[4*DMAX];
int PozUpdate, ValUpdate;
int PrimInterval, UltimInterval, Maxim;

void citire();
void update(int nod, int st, int dr);
void query(int nod, int st, int dr);

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

void citire()
{
    int i, tip, a, b;
    fin>>n>>m;
    for(i=1;i<=n;++i)
    {
        fin>>ValUpdate;
        PozUpdate=i;
        update(1, 1, n);
    }

    for(i=1;i<=m;++i)
    {
        fin>>tip>>a>>b;
        if(tip)//valoarea elementului de pe pozitia a devine b
        {
            PozUpdate=a; ValUpdate=b;
            update(1, 1, n);
        }
            else//maximul pe intervalul [a, b]
            {
                PrimInterval=a; UltimInterval=b; Maxim=0;
                query(1, 1, n);
                fout<<Maxim<<'\n';
            }
    }
}

void update(int nod, int st, int dr)
{
    if(st==dr)
    {
        A[nod]=ValUpdate;
        return;
    }

    int mij=(st+dr)/2;
    if(PozUpdate<=mij) update(2*nod, st, mij);
        else update(2*nod+1, mij+1, dr);

    A[nod]=max(A[2*nod], A[2*nod+1]);
}

void query(int nod, int st, int dr)
{
    if(PrimInterval<=st && dr<=UltimInterval)
    {
        Maxim=max(Maxim, A[nod]);
        return;
    }

    int mij=(st+dr)/2;
    if(PrimInterval<=mij) query(2*nod, st, mij);
    if(mij<UltimInterval) query(2*nod+1, mij+1, dr);
}