Cod sursa(job #2377085)

Utilizator AndreiBadescuBadescu Andrei-Octavian AndreiBadescu Data 8 martie 2019 21:34:32
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>

#define N 100001

using namespace std;
typedef unsigned int uint;

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

uint n,m,v[N],tree[2*N];

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

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

void update(uint a, uint b)
{
    tree[a += n] = b;

    while (a > 0)
    {
        tree[a >> 1] = max(tree[a], tree[a ^ 1]);
        a >>= 1;
    }
}

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

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

    return ma;
}

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

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

    build();

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

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