Cod sursa(job #1746084)

Utilizator meriniucrMeriniuc Razvan- Dumitru meriniucr Data 22 august 2016 17:49:00
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <bits/stdc++.h>

int n;
int m;
int arr[100001];
int it[200002];

void
build(int beg,
      int end,
      int index)
{
    if (beg == end)
    {
        it[index] = arr[beg];
    }
    else
    {
        build(beg,
              (beg + end) / 2,
              2 * index);
        build((beg + end) / 2 + 1,
              end,
              2 * index + 1);
        it[index] = std::max(it[2 * index], it[2 * index + 1]);
    }
}

int
query(int beg,
      int end,
      int b,
      int e,
      int index)
{
    int mid;
    int res;

    if (beg > end)
    {
        return std::numeric_limits <int>::min();
    }
    
    if ( (beg == b) and
         (end == e) )
    {
        return it[index];
    }

    mid = (beg + end) / 2;

    if (mid < b)
    {
        res = query(mid + 1,
                    end,
                    b,
                    e,
                    2 * index + 1);
    }
    else if (mid >= e)
    {
        res = query(beg,
                    mid,
                    b,
                    e,
                    2 * index);
    }
    else
    {
        res = std::max(query(beg, mid, b, mid, 2 * index),
                       query(mid + 1, end, mid + 1, e, 2 * index + 1));
    }

    return res;
}

void
update(int pos,
       int val,
       int beg,
       int end,
       int index)
{
    if (beg == end)
    {
        it[index] = val;
    }
    else
    {
        if (pos > (beg + end) / 2)
        {
            update(pos,
                   val,
                   (beg + end) / 2 + 1,
                   end,
                   2 * index + 1);
        }
        else
        {
            update(pos,
                   val,
                   beg,
                   (beg + end) / 2,
                   2 * index);
        }

        it[index] = std::max(it[2 * index],
                             it[2 * index + 1]);
    }
}

int main()
{
    int index;
    int op;
    int x;
    int y;

    std::ifstream mama("arbint.in");
    std::ofstream tata("arbint.ouy");

    mama >> n;
    mama >> m;

    for (index = 1; index <= n; ++index)
    {
        mama >> arr[index];
    }

    build(1, n, 1);

    for (index = 0; index < m; ++index)
    {
        mama >> op;
        mama >> x;
        mama >> y;

        if (0 == op)
        {
            tata << query(1, n, x, y, 1) << '\n';
        }
        else
        {
            update(x, y, 1, n, 1);
        }
    }

    return 0;
}