Cod sursa(job #2659780)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 17 octombrie 2020 13:49:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMax = 100000;
int A[NMax + 5]; int N,M,Max;
int AINT[4 * NMax + 5];
void Read()
{
    fin >> N >> M;
    for(int i = 1; i <= N; ++i)
        fin >> A[i];
}
void Update(int K, int Left, int Right, int Pos, int Value)
{
    if(Left == Right)
    {
        AINT[K] = Value;
        return;
    }
    int Mid = (Left + Right) / 2;
    if(Pos <= Mid)
        Update(2 * K, Left, Mid, Pos, Value);
    else
        Update(2 * K + 1, Mid + 1, Right, Pos, Value);
    AINT[K] = max(AINT[2*K], AINT[2*K+1]);
}

void Query(int K,int Left, int Right, int QLeft, int QRight)
{
    if(QLeft <= Left && Right <= QRight)
    {
        Max = max(Max, AINT[K]);
        return;
    }
    if(Right < QLeft || QRight < Left)
    {
        return;
    }
    int Mid = (Left + Right) / 2;
    Query(2*K,Left,Mid,QLeft,QRight);
    Query(2*K+1,Mid+1,Right,QLeft,QRight);
}

void Solve()
{
    while(M--)
    {
        int op,a,b;
        fin >> op >> a >> b;
        if(op == 1)
            Update(1,1,N,a,b);
        if(op == 0)
        {
            Max = 0;
            Query(1,1,N,a,b);
            fout << Max << "\n";
        }

    }
}
void Build(int K, int Left, int Right)
{
    if (Left == Right)
    {
        AINT[K] = A[Left];
        return;
    }
    int Mid = (Left + Right) / 2;
    Build(2 * K, Left, Mid);
    Build(2 * K + 1, Mid + 1, Right);
    AINT[K] = max(AINT[2*K], AINT[2*K+1]);
}
int main()
{
    Read();
    Build(1,1,N);
    Solve();
    return 0;
}