Cod sursa(job #1676249)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 5 aprilie 2016 19:56:11
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <cstdio>
using namespace std;

FILE *in, *out;

const int dim = 100005;

int MaxArb[2 * dim];

int Max, start, finish;

int Pos, Val;

int N, Q;

int maxim(int x, int y)
{
    if(x > y) return x;
    else
        return y;
}

void Update(int node, int Left, int Right)
{
    if(Left == Right) {MaxArb[node] = Val; return;}

    int mid = (Left + Right) / 2;

    if(Pos <= mid) Update(2 * node, Left, mid);
    else
        Update(2 * node + 1, mid + 1, Right);

    MaxArb[node] = maxim(MaxArb[2 * node], MaxArb[2 * node + 1]);
}

void Query(int node, int Left, int Right)
{
    if( (start <= Left) && (finish >= Right) )
    {
        Max = maxim(Max, MaxArb[node]);
        return;
    }

    int mid = (Left + Right) / 2;

    if(start <= mid) Query(2 * node, Left, mid);

    if(finish > mid) Query(2 * node + 1, mid + 1, Right);
}

int main()
{
    in = fopen("arbint.in", "r");
    out = fopen("arbint.out", "w");

    int i, x, T;

    fscanf(in, "%d %d", &N, &Q);

    for(i = 1; i <= N; i++)
    {
        fscanf(in, "%d", &x);

        Pos = i;
        Val = x;

        Update(1, 1, N);
    }

    for(i = 1; i <= Q; i++)
    {
        fscanf(in, "%d %d %d", &T, &start, &finish);

        if(T == 0)
        {
            Max = -1;
            Query(1, 1, N);

            fprintf(out, "%d\n", Max);
        }
        else
        {
            Pos = start;
            Val = finish;

            Update(1, 1, N);
        }
    }

    return 0;
}