Cod sursa(job #1648975)

Utilizator blue_skyPetrica Stefan Cosmin blue_sky Data 11 martie 2016 12:11:00
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <cstdio>
#define DIM 100001

using namespace std;

int n, m, v[7 * DIM], x, y, t;

void update(int k, int poz, int value, int left, int right)
{
    if(left == right) v[k] = value;

    else
    {
        int mid = (left + right) / 2;

        if(poz <= mid) update(k * 2, poz, value, left, mid);
        else update(k * 2 + 1, poz, value, mid + 1, right);

        v[k] = max(v[k * 2], v[k * 2 + 1]);
    }
}

int query(int k, int a, int b, int left, int right)
{
    if(a <= left && b >= right) return v[k];

    int mid = (left + right) / 2;

    if(b <= mid) return query(k * 2, a, b, left, mid);
    if(a > mid) return query(k * 2 + 1, a, b, mid, right);
    int ls = query(k * 2, a, mid, left, mid);
    int rs = query(k * 2 + 1, mid + 1, b, mid + 1, right);
    return max(ls, rs);
}

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

    f >> n >> m;

    for(int i = 1; i <= n; ++i)
    {
        f >> x;
        update(1, i, x, 1, n);
    }

    for(int i = 1; i <= m; ++i)
    {
        f >> t >> x >> y;

        if(t == 1) update(1, x, y, 1, n);
        else g << query(1, x, y, 1, n) << '\n';
    }
    f.close();
    g.close();

    return 0;
}