Cod sursa(job #2803591)

Utilizator Horia14Horia Banciu Horia14 Data 20 noiembrie 2021 11:24:54
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.42 kb
#include <fstream>
#include <iostream>
#define oo 0x7fffffff
using namespace std;

class SegmentTree
{
private:
    int* v;
    int* segTree;
    int Size;
public:
    SegmentTree(int Size)
    {
        this->Size = Size;
        v = new int[Size];
        segTree = new int[4 * Size + 1];
    }

    ~SegmentTree()
    {
        delete[] v;
        delete[] segTree;
    }

    void addNumber(int pos, int x)
    {
        v[pos] = x;
    }

    void buildSegmentTree(int low, int high, int root)
    {
        if(low == high)
            segTree[root] = v[low];
        else
        {
            int mid = (low + high) >> 1;
            buildSegmentTree(low, mid, 2 * root + 1);
            buildSegmentTree(mid + 1, high, 2 * root + 2);
            segTree[root] = max(segTree[2 * root + 1], segTree[2 * root + 2]);
        }
    }

    void updateSegmentTree(int low, int high, int root, int X, int Y)
    {
        // The value of the element X will become Y
        if(low == high)
            segTree[root] = Y;
        else
        {
            int mid = (low + high) >> 1;
            if(X <= mid) // The index is in the left subtree
                updateSegmentTree(low, mid, 2 * root + 1, X, Y);
            else
                updateSegmentTree(mid + 1, high, 2 * root + 2, X, Y);

            segTree[root] = max(segTree[2 * root + 1], segTree[2 * root + 2]);
        }
    }

    int RMQ(int low, int high, int root, int Begin, int End)
    {
        if(Begin <= low && high <= End)
            return segTree[root];

        if(Begin > high || End < low)
            return -oo;

        int mid = (low + high) >> 1;

        return max(RMQ(low, mid, 2 * root + 1, Begin, End),
                   RMQ(mid + 1, high, 2 * root + 2, Begin, End));
    }

};

int main()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    int n, m, x, y, opType;
    fin >> n >> m;
    SegmentTree* sTree = new SegmentTree(n);
    for(int i = 0; i < n; ++i)
    {
        fin >> x;
        sTree->addNumber(i, x);
    }

    sTree->buildSegmentTree(0, n - 1, 0);

    for(int i = 0; i < m; ++i)
    {
        fin >> opType >> x >> y;
        if(opType == 0)
            fout << sTree->RMQ(0, n - 1, 0, x - 1, y - 1) << "\n";
        else
        {
            sTree->updateSegmentTree(0, n - 1, 0, x - 1, y);
        }
    }

    delete sTree;
    return 0;
}