Cod sursa(job #2478974)

Utilizator Horia14Horia Banciu Horia14 Data 22 octombrie 2019 23:10:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include<fstream>
#include<iostream>
#define MAX_N 100000
#define oo 0x7fffffff
using namespace std;

class segmentTree {
private:
    int segTree[4*MAX_N + 1], arr[MAX_N + 1];
    int n;
public:
    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]);
        }
    }
    void buildSegmentTree(int low, int high, int pos) {
        if(low == high)
            segTree[pos] = arr[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]);
        }
    }
    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 m, op, x, y, i;
        ifstream fin(name_fin);
        ofstream fout(name_fout);
        fin >> n >> m;
        for(i = 1; i <= n; i++)
            fin >> arr[i];
        buildSegmentTree(1, n, 1);
        for(i = 1; i <= m; i++) {
            fin >> op >> x >> y;
            if(op == 0)
                fout << maxQuery(1, n, 1, x, y) << "\n";
            else updateSegmentTree(1, n, 1, x, y);
        }
        fin.close();
        fout.close();
    }
};

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