Cod sursa(job #1833194)

Utilizator PaulStighiStiegelbauer Paul-Alexandru PaulStighi Data 21 decembrie 2016 21:32:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include<fstream>
#define NMax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int N,M,QL,QR,K,Val;
int A[NMax],IT[4*NMax];

void Build(int Nod,int L,int R)
{
    int Mid = (L + R) / 2;

    if(L == R)
    {
        IT[Nod] = A[Mid];
        return;
    }

    Build(2*Nod,L,Mid);
    Build(2*Nod+1,Mid+1,R);

    IT[Nod] = max(IT[2*Nod],IT[2*Nod+1]);
}

void Read()
{
    fin>>N>>M;

    for(int i = 1 ; i <= N ; ++i)
        fin>>A[i];

    Build(1,1,N);
}

void Update(int Nod,int L,int R)
{
    int Mid = (L + R) / 2;

    if(L == R)
    {
        IT[Nod] = Val;
        return;
    }

    if(K <= Mid)    Update(2*Nod,L,Mid);
    else            Update(2*Nod+1,Mid+1,R);

    IT[Nod] = max(IT[2*Nod],IT[2*Nod+1]);
}

int Query(int Nod,int L,int R)
{
    int Mid = (L + R) / 2;

    if(QL <= L && R <= QR)  return IT[Nod];

    int QMax = 0;

    if(QL <= Mid)    QMax = max(QMax,Query(2*Nod,L,Mid));
    if(QR > Mid)     QMax = max(QMax,Query(2*Nod+1,Mid+1,R));

    return QMax;
}

int main()
{
    Read();

    while(M--)
    {
        int cod,a,b;    fin>>cod;

        if(cod)
        {
            fin>>K>>Val;
            Update(1,1,N);
        }
        else
        {
            fin>>QL>>QR;
            fout<<Query(1,1,N)<<"\n";
        }
    }

    fin.close();
    fout.close();
    return 0;
}