Cod sursa(job #1676404)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 5 aprilie 2016 21:43:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <cstdio>
using namespace std;

FILE *in, *out;

const int dmax = 262144;

int Pos, Val;

int MaxArb[dmax];

int Max, a, b;

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(Left >= a && Right <= b)
    {
        Max = maxim(Max, MaxArb[node]);
        return;
    }

    int mid = (Left + Right) / 2;

    if(a <= mid) query(2 * node, Left, mid);
    if(b > mid) query(2 * node + 1, mid + 1, Right);
}

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

    int i, T, x;

    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, &a, &b);

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

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

            Update(1, 1, N);
        }
    }

    return 0;
}