Cod sursa(job #2355580)

Utilizator AndreiBadescuBadescu Andrei-Octavian AndreiBadescu Data 26 februarie 2019 10:12:24
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;
typedef unsigned int uint;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

void build(uint tree[], uint v[])
{
    for (uint i = 0; i < tree[0]; ++i)
        tree[i + tree[0]] = v[i];

    for (uint i = tree[0] - 1; i > 0; --i)
        tree[i] = max(tree[i << 1], tree[i << 1 | 1]);
}

void update(uint tree[], uint p, uint val)
{
    p += tree[0];
    tree[p] = val;

    for (uint i = p >> 1; i > 0; i >>= 1)
    {
        tree[i] = max(tree[p], tree[p ^ 1]);
        p = i;
    }
}

uint query(uint tree[], uint l, uint r)
{
    uint res = 0;
    for (l += tree[0], r += tree[0]; l < r; l >>= 1, r >>= 1)
    {
        if (l & 1)
            res = max(res, tree[l++]);

        if (r & 1)
            res = max(res, tree[--r]);
    }

    return res;
}

int main()
{
    uint n,m;
    fin >> n >> m;

    uint v[n];
    for (uint i = 0; i < n; ++i)
        fin >> v[i];

    uint tree[n << 1];
    tree[0] = n;
    build(tree, v);

    for (uint t,a,b,i = 0; i < m; ++i)
    {
        fin >> t >> a >> b;

        if (t)
            update(tree, a - 1, b);
        else
            fout << query(tree, a - 1, b) << '\n';
    }
}