Cod sursa(job #1760724)

Utilizator enacheionutEnache Ionut enacheionut Data 21 septembrie 2016 10:02:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include <stdio.h>
#include <vector>

using namespace std;

int numberOfElements;
int numberOfQueries;
int beginQueryInterval;
int endQueryInterval;
int maximum;
int position;
int value;
vector<int> intervalTree(400500);

void Update(int currentNod, int beginInterval, int endInterval)
{
    if( beginInterval == endInterval )
    {
        intervalTree[currentNod] = value;
        return;
    }
    else
    {
        int middle = (beginInterval + endInterval) >> 1;
        if(position <= middle)
        {
            Update(currentNod << 1, beginInterval, middle);
        }
        else
        {
            Update((currentNod << 1) +1, middle + 1, endInterval);
        }
        intervalTree[currentNod] = max( intervalTree[currentNod << 1], intervalTree[(currentNod << 1) + 1] );
    }
}

void MaximumValueOfInterval(int currentNod, int beginInterval, int endInterval)
{
    if( beginQueryInterval <= beginInterval && endQueryInterval >= endInterval )
    {
        if( maximum < intervalTree[currentNod] )
        {
            maximum = intervalTree[currentNod];
        }
        return;
    }
    else
    {
        int middle = ((beginInterval + endInterval)) >> 1;
        if( beginQueryInterval <= middle)
        {
            MaximumValueOfInterval(currentNod << 1, beginInterval, middle);
        }

        if( middle < endQueryInterval )
        {
            MaximumValueOfInterval((currentNod << 1) + 1, middle + 1, endInterval);
        }
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    scanf("%d%d", &numberOfElements, &numberOfQueries);
    for( int i = 1; i<=numberOfElements; ++i )
    {
        scanf("%d", &value);
        position = i;
        Update(1, 1, numberOfElements);
    }

    int queryType;
    int aux1;
    int aux2;

    while(numberOfQueries--)
    {
        scanf("%d%d%d", &queryType, &aux1, &aux2);

        if( !queryType )
        {
            maximum = -1;
            beginQueryInterval = aux1;
            endQueryInterval = aux2;
            MaximumValueOfInterval(1, 1, numberOfElements);
            printf("%d\n", maximum);
        }
        else
        {
            position = aux1;
            value = aux2;
            Update(1, 1, numberOfElements);
        }
    }

    return 0;
}