Cod sursa(job #2485476)

Utilizator Horia14Horia Banciu Horia14 Data 1 noiembrie 2019 17:29:49
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include<fstream>
#define MAX_N 100000
#define oo 0x7fffffff
using namespace std;

class segmentTree {
private:
    int v[MAX_N + 1], segTree[4*MAX_N + 1], n;
public:
    void buildSegmentTree(int low, int high, int pos) {
        if(low == high)
            segTree[pos] = v[low];
        else {
            int mid = (low + high) >> 1;
            buildSegmentTree(low, mid, 2 * pos);
            buildSegmentTree(mid + 1, high, 2 * pos + 1);
            segTree[pos] = max(segTree[2 * pos], segTree[2 * pos + 1]);
        }
    }

    void updateSegmentTree(int low, int high, int pos, int a, int b) {
        if(low == high)
            segTree[pos] = b;
        else {
            int mid = (low + high) >> 1;
            if(a <= mid)
                updateSegmentTree(low, mid, 2 * pos, a, b);
            else updateSegmentTree(mid + 1, high, 2 * pos + 1, a, b);
            segTree[pos] = max(segTree[2 * pos], segTree[2 * pos + 1]);
        }
    }

    int maxQuery(int low, int high, int pos, int qlow, int qhigh) {
        if(qlow <= low && high <= qhigh)
            return segTree[pos];
        if(qlow > high || qhigh < low)
            return -oo;
        int mid = (low + high) >> 1;
        return max(maxQuery(low, mid, 2 * pos, qlow, qhigh),
                   maxQuery(mid + 1, high, 2 * pos + 1, qlow, qhigh));
    }

    void readArray(string name_fin, string name_fout) {
        int i, nr, a, b, m;
        ifstream fin(name_fin);
        ofstream fout(name_fout);
        fin >> n >> m;
        for(i = 1; i <= n; i++)
            fin >> v[i];
        buildSegmentTree(1, n, 1);
        for(i = 1; i <= m; i++) {
            fin >> nr >> a >> b;
            if(nr == 0)
                fout << maxQuery(1, n, 1, a, b) << "\n";
            else updateSegmentTree(1, n, 1, a, b);
        }
        fin.close();
        fout.close();
    }
};

int main() {
    segmentTree s;
    s.readArray("arbint.in", "arbint.out");
    return 0;
}