Cod sursa(job #2423329)

Utilizator melutMelut Zaid melut Data 21 mai 2019 05:14:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.45 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;


string const inFile = "arbint.in";
string const outFile = "arbint.out";


ifstream Read(inFile);
ofstream Write(outFile);


void CloseFiles(ifstream &Read, ofstream &Write) {
    Read.close();
    Write.close();
}


inline unsigned QueryTree(vector<unsigned> &vec,
               unsigned node,
               unsigned left,
               unsigned right,
               unsigned intervalLeft,
               unsigned intervalRight)
{
    if (left >= intervalLeft)
    if (right <= intervalRight) {
        return vec[node];
    }

    unsigned mid = (left + right - 1) >> 1;
    unsigned leftValue = 0;
    unsigned rightValue = 0;

    if (intervalLeft <= mid) {
        leftValue = QueryTree(vec, (node << 1) + 1, left, mid, intervalLeft, intervalRight);
    }

    if (intervalRight > mid) {
        rightValue = QueryTree(vec, (node << 1) + 2, mid + 1, right, intervalLeft, intervalRight);
    }

    return max(leftValue, rightValue);
}


inline void UpdateTree(vector<unsigned> &vec,
                unsigned node,
                unsigned left,
                unsigned right,
                unsigned pos,
                unsigned value)
{
    if (node >= vec.size()) {
        vec.resize(node + 1);
    }

    if (left == right) {
        vec[node] = value;

        return;
    }

    unsigned mid = (left + right - 1) >> 1;

    if (pos <= mid) {
        UpdateTree(vec, (node << 1) + 1, left, mid, pos, value);
    }
    else {
        UpdateTree(vec, (node << 1) + 2, mid + 1, right, pos, value);
    }

    vec[node] = max(vec[(node << 1) + 1], vec[(node << 1) + 2]);
}


void BuildTree(vector<unsigned> &vec, unsigned &n, unsigned &m) {
    Read >> n;
    Read >> m;

    unsigned value;

    for (unsigned i = 0; i < n; ++i) {
        Read >> value;

        UpdateTree(vec, 0, 0, n - 1, i, value);
    }
}


int main() {
    unsigned n;
    unsigned m;
    vector<unsigned> vec;

    BuildTree(vec, n, m);

    unsigned type;
    unsigned a;
    unsigned b;

    while (m--) {
        Read >> type;
        Read >> a;
        Read >> b;

        if (type == 0) {
            Write << QueryTree(vec, 0, 0, n - 1, a - 1, b - 1) << '\n';
        }
        else if (type == 1) {
            UpdateTree(vec, 0, 0, n - 1, a - 1, b);
        }
    }

    CloseFiles(Read, Write);

    return 0;
}