Cod sursa(job #1844812)

Utilizator Dupree7FMI Ciobanu Andrei Dupree7 Data 10 ianuarie 2017 15:17:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>

#define Nmax 100001
using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int sgm_tree[Nmax << 2], N, M, v[Nmax];

int maxim(int a, int b)
{
    return (a > b) ? a : b;
}

void recalculate(int node)
{
    sgm_tree[node] = maxim(sgm_tree[node << 1], sgm_tree[(node << 1) + 1]);
}

void build_sgm_tree(int node, int left, int right)
{
    if(left != right)
    {
        int mid = (left + right) >> 1;
        build_sgm_tree(node << 1, left, mid);
        build_sgm_tree((node << 1) + 1, mid + 1, right);
        recalculate(node);
    }
    else
    {
        sgm_tree[node] = v[left];
    }
}

void update(int node, int left, int right, int x, int y)
{
    if(left == right)
    {
        sgm_tree[node] = y;
    }
    else
    {
        int mid = (left + right) >> 1;

        if(x <= mid)
            update(node << 1, left, mid, x, y);
        else
            update((node << 1) + 1, mid + 1, right, x, y);

        recalculate(node);
    }
}

int query(int node, int left, int right, int x, int y)
{
    if(x <= left && right <= y)
        return sgm_tree[node];
    else
    {
        int answer = -1;
        int mid = (left + right) >> 1;

        if(x <= mid)
            answer = maxim(answer, query(node << 1, left, mid, x, y));
        if(y >= mid + 1)
            answer = maxim(answer, query((node << 1) + 1, mid + 1, right, x, y));

        return answer;
    }
}

int main()
{
    int i, ok, a, b;

    f >> N >> M;

    for(i = 1; i < N + 1; i++)
        f >> v[i];

    build_sgm_tree(1, 1, N);

    for(i = 0; i < M; i++)
    {
        f >> ok >> a >> b;

        if(ok)
            update(1, 1, N, a, b);
        else
            g << query(1, 1, N, a, b) << "\n";
    }

    return 0;
}