Cod sursa(job #2432164)

Utilizator xtreme77Patrick Sava xtreme77 Data 22 iunie 2019 14:02:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>

using namespace std;

ifstream cin ("arbint.in");
ofstream cout ("arbint.out");

const int MAX = static_cast<const int>(1e5 + 14);

int v[MAX];
int tree[MAX << 2];

void build(int node, int st, int dr)
{
    if (st == dr)
        tree[node] = v[st];
    else
    {
        int mij = (st + dr) / 2;
        build (node * 2, st, mij);
        build (node * 2 + 1, mij + 1, dr);
        tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
    }
}

void update (int node, int st, int dr, const int pos, const int val)
{
    if (st == dr)
        tree[node] = val;
    else
    {
        int mij = (st + dr) / 2;
        if (pos <= mij)
            update(node * 2, st, mij , pos, val);
        else
            update (node * 2 + 1, mij + 1, dr, pos, val);
        tree[node] = max(tree[node * 2], tree[node * 2 + 1]);
    }
}

int query (int node, int st, int dr, const int a, const int b)
{
    if (a <= st and dr <= b)
        return tree [node];
    else
    {
        int mij = (st + dr) / 2;
        int best = 0;
        if (a <= mij)
            best = max(best, query(node * 2, st, mij, a, b));
        if (b > mij)
            best = max(best, query(node * 2 + 1, mij + 1, dr, a, b));
        return best;
    }
}


int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++ i)
        cin >> v [i];
    build(1, 1, n);
    while (m --)
    {
        int tip;
        cin >> tip;
        if (tip == 0)
        {
            int a, b;
            cin >> a >> b;
            cout << query(1, 1, n, a, b) << '\n';
        }
        else
        {
            int pos, val;
            cin >> pos >> val;
            update(1, 1, n, pos, val);
        }
    }
    return 0;
}