Cod sursa(job #1999506)

Utilizator dan.marculetFII MarculetDan dan.marculet Data 11 iulie 2017 12:42:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.94 kb
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
using namespace std;

#define NAME "arbint"
#define MAXN 100001
#define MAXM 100001
#define INF 0x3f3f3f3f

auto fin = fopen(NAME ".in", "r");
auto fout = fopen(NAME ".out", "w");

int n;
int m;
vector<int> v;
vector<int> arb;
// string spaces;

int max(int a, int b) {
    return a >= b ? a : b;
}

int query(int node, int left, int right, int& qleft, int& qright) {
    // spaces.append(" ");
    // printf("%sq[%d-%d] val %d\n", spaces.c_str(), left, right, arb[node]);
    if (qleft <= left && right <= qright)
        // return spaces.pop_back(), arb[node];
        return arb[node];
    auto mij = (left + right) / 2;
    int ret1 = -INF, ret2 = -INF;
    if (qleft <= mij)
        ret1 = query(2 * node + 1, left, mij, qleft, qright);
    if (mij < qright)
        ret2 = query(2 * node + 2, mij + 1, right, qleft, qright);
    // spaces.pop_back();
    return max(ret1, ret2);
}

int query(int left, int right) {
    // printf("Query for [%d-%d]\n", left, right);
    // spaces = "";
    return query(0, 0, v.size() - 1, left, right);
}

int createarb(int node, int left, int right) {
    if (left == right)
        return arb[node] = v[left];
    auto mij = (left + right) / 2;
    auto lval = createarb(2 * node + 1, left, mij);
    auto rval = createarb(2 * node + 2, mij + 1, right);
    return arb[node] = max(lval, rval);
}

int createarb() {
    return createarb(0, 0, v.size() - 1);
}

int update(int node, int left, int right, int& pos, int& val) {
    // spaces.append(" ");
    // printf("%su[%d-%d] val %d\n", spaces.c_str(), left, right, arb[node]);
    if (left == right && left == pos)
        return arb[node] = val;
    auto mij = (left + right) / 2;
    if (pos <= mij)
        return arb[node] = max(arb[2 * node + 2],
                               update(2 * node + 1, left, mij, pos, val));
    return arb[node] = max(arb[2 * node + 1],
                           update(2 * node + 2, mij + 1, right, pos, val));
}

int update(int pos, int val) {
    // printf("Update for v[%d] = %d\n", pos, val);
    // spaces = "";
    return update(0, 0, v.size() - 1, pos, val);
}

int main() {
    fscanf(fin, "%d %d", &n, &m);
    v.resize(n);
    for (auto i = 0; i < n; ++i)
        fscanf(fin, "%d", &v[i]);

    int npow2 = 1;
    while (npow2 < 2 * n - 1)
        npow2 <<= 1;
    // printf("%d\n", npow2);

    arb.resize(npow2);
    memset(&arb[0], 0x3f, arb.size() * sizeof(int));
    createarb(0, 0, n - 1);

    int op, arg1, arg2;
    for (auto i = 0; i < m; ++i) {
        fscanf(fin, "%d %d %d", &op, &arg1, &arg2);
        // printf("%d %d %d\n", op, arg1, arg2);
        if (op == 0)
            fprintf(fout, "%d\n", query(arg1 - 1, arg2 - 1));
            // printf("%d\n", query(arg1 - 1, arg2 - 1));
        else
            update(arg1 - 1 , arg2);
    }

    return 0;
}