Cod sursa(job #1362762)

Utilizator hopingsteamMatraguna Mihai-Alexandru hopingsteam Data 26 februarie 2015 15:15:39
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include    <iostream>
#include    <fstream>

using namespace std;

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

const int NMax = 100005;

int N, M;
int V[NMax], AINT[4 * NMax];
int Result;

void BuildAINT(int Node, int Left, int Right)
{
    if(Left == Right)
    {
        AINT[Node] = V[Left];
        return;
    }

    int Mid = (Left + Right) / 2;

    BuildAINT(2 * Node,         Left,       Mid);
    BuildAINT(2 * Node + 1,     Mid + 1,    Right);

    AINT[Node] = max(   AINT[2 * Node],     AINT[2 * Node + 1]      );
}

void Update(int Node, int Left, int Right, int P, int V)
{
    if(Left == Right)
    {
        AINT[Node] = V;
        return;
    }

    int Mid = (Left + Right) / 2;
    if(P <= Mid)
        Update(2 * Node, Left, Mid, P, V);
    else
        Update(2 * Node + 1, Mid + 1, Right, P, V);

    AINT[Node] = max(   AINT[2 * Node],     AINT[2 * Node + 1]      );
}

void Query(int Node, int Left, int Right, int Start, int Finish)
{
    int(Left >= Start && Right <= Finish)
    {
        Result = max(Result, AINT[Node]);
        return;
    }

    int Mid = (Left + Right) / 2;

    if(Mid <= Left)
        Query(2 * Node, Left, Mid, Start, Finish);
    if(Right > Mid)
        Query(2 * Node + 1, Mid + 1, Right, Start, Finish);
}

void Read()
{
    fin >> N >> M;
    for(int i = 1; i <= N; i++)
        fin >> V[i];
    BuildAINT(1,1,N);

    for(int i = 1; i <= M; i++)
    {
        int type, a, b;
        fin >> type >> a >> b;
        if(type == 0)
        {
            Result = 0;
            Query(1,1,N,a,b);
            fout << Result << "\n";
        }
        else
        {
            Update(1,1,N,a,b);
        }
    }
}

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