Cod sursa(job #1206277)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 9 iulie 2014 13:48:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream is("arbint.in");
ofstream os("arbint.out");

typedef int Arbore;
int N, M;
int x, y, z, P1, P2;
int maxim;
Arbore A[400001];

void Update(int node, int left, int right);
void Query(int node, int left, int right);

int main()
{
    is >> N >> M;
    for ( int i = 1; i <= N; ++i )
    {
        is >> x;
        P1 = i; P2 = x;
        Update(1,1,N);
    }
    for ( int i = 1; i <= M; ++i )
    {
        is >> z >> x >> y;
        if ( z == 0 )
        {
            maxim = -1;
            P1 = x;
            P2 = y;
            Query(1,1,N);
            os << maxim << '\n';
        }
        if ( z == 1 )
        {
            P1 = x;
            P2 = y;
            Update(1,1,N);
        }
    }
}

void Update(int node, int left, int right)
{
    if ( left == right )
    {
        A[node] = P2;
        return;
    }

    int Mid = (left+right)/2;

    if ( P1 <= Mid )
        Update(2*node,left,Mid);
    else
        Update(2*node+1,Mid+1,right);

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

void Query(int node, int left, int right)
{
    if ( P1 <= left && P2 >= right )
    {
        if ( maxim <= A[node] )
            maxim = A[node];
        return;
    }

    int Mid = (left+right)/2;

    if ( P1 <= Mid ) Query(2*node,left,Mid);
    if ( P2 > Mid ) Query(2*node+1,Mid+1,right);
}