Cod sursa(job #1036871)

Utilizator Alexghita96Ghita Alexandru Alexghita96 Data 19 noiembrie 2013 18:03:00
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>

#define Nmax 400010

int N, M, x, A[Nmax], p, a, b, max;

void Update(int i, int m, int M)
{
    if (m == M)
    {
        A[i] = x;
        return;
    }
    int mij = (m + M) / 2;
    if (p <= mij)
        Update(2 * i, m, mij);
    else
        Update(2 * i + 1, mij + 1, M);
    if (A[2 * i] > A[2 * i + 1])
        A[i] = A[2 * i];
    else
        A[i] = A[2 * i + 1];
}

void Query(int i, int s, int d)
{
    if (a <= s && b >= d)
    {
        if (max < A[i])
            max = A[i];
        return;
    }
    int mij = (s + d) / 2;
    if (a <= mij)
    {
        Query(2 * i, a, mij);
    }
    if (b > mij)
    {
        Query(2 * i + 1, mij + 1, b);
    }
}

void Citire()
{
    int t;
    scanf("%d %d", &N, &M);
    for (p = 1; p <= N; ++p)
    {
        scanf("%d", &x);
        Update(1, 1, N);
    }
    for (int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d", &t, &a, &b);
        if (t == 0)
        {
            max = -1;
            Query(1, 1, N);
            printf("%d\n", max);
        }
        else if (t == 1)
        {
            x = b;
            p = a;
            Update(1, 1, N);
        }
    }
}

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

    Citire();

    return 0;
}