Cod sursa(job #3166573)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 9 noiembrie 2023 00:19:14
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 100000;
int v[NMAX + 1];
int arb[4 * NMAX + 1];

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

void uniteParents(int nodeId, int leftNodeId, int rightNodeId) {
    arb[nodeId] = max(arb[leftNodeId], arb[rightNodeId]);
}

void build(int nodeId, int leftIndex, int rightIndex) {
    if (leftIndex == rightIndex) {
        arb[nodeId] = v[leftIndex];
        return;
    }

    int middle = (leftIndex + rightIndex) / 2;
    build(2 * nodeId, leftIndex, middle);
    build(2 * nodeId + 1, middle + 1, rightIndex);
    uniteParents(nodeId, 2 * nodeId, 2 * nodeId + 1);
}

void update(int nodeId, int leftIndex, int rightIndex, int updateIndex, int updateValue) {
    if (leftIndex == rightIndex) {
        arb[nodeId] = updateValue;
        return;
    }

    int middle = (leftIndex + rightIndex) / 2;
    if (updateIndex <= middle)
        update(2 * nodeId, leftIndex, middle, updateIndex, updateValue);
    else
        update(2 * nodeId + 1, middle + 1, rightIndex, updateIndex, updateValue);
    
    uniteParents(nodeId, 2 * nodeId, 2 * nodeId + 1);
}

int uniteQueries(int queryLeftBranch, int queryRightBranch) {
    return max(queryLeftBranch, queryRightBranch);
}

int query(int nodeId, int leftIndex, int rightIndex, int queryLeftIndex, int queryRightIndex) {
    if (leftIndex == queryLeftIndex && rightIndex == queryRightIndex) {
        return arb[nodeId];
    }

    int middle = (leftIndex + rightIndex) / 2;
    int queryLeftBranch, queryRightBranch;
    queryLeftBranch = queryRightBranch = 0;

    if (queryLeftIndex <= middle)
        queryLeftBranch = query(2 * nodeId, leftIndex, middle, queryLeftIndex, middle);
    if (middle + 1 <= queryRightIndex)
        queryRightBranch = query(2 * nodeId + 1, middle + 1, rightIndex, middle + 1, queryRightIndex);

    return uniteQueries(queryLeftBranch, queryRightBranch);
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");

    int n, m, op, a, b;

    fscanf(fin, "%d %d", &n, &m);
    for (int i = 1; i <= n; i++)
        fscanf(fin, "%d", &v[i]);
    build(1, 1, n);

    for (int i = 1; i < 4 * n; i++) {
        cout << "i = " << i << "   arb[] = " << arb[i] << "\n";
    }
    
    for (int i = 0; i < m; i++) {
        fscanf(fin, "%d %d %d", &op, &a, &b);
        if (op == 0)
            fprintf(fout, "%d\n", query(1, 1, n, a, b));
        else
            update(1, 1, n, a, b);
    }

    return 0;
}