Cod sursa(job #2931801)

Utilizator trifangrobertRobert Trifan trifangrobert Data 31 octombrie 2022 22:45:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.9 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 1e5;
int N, M;
class SegmentTree {
private:
    int nodes;
    vector <int> values;
    vector <int> seg_tree;
    int LeftSon(int node) {
        return 2 * node;
    }
    int RightSon(int node) {
        return 2 * node + 1;
    }
    void Build(int node, int left, int right) {
        if (left == right) {
            seg_tree[node] = values[left];
        }
        else {
            int mid = (left + right) / 2;
            Build(LeftSon(node), left, mid);
            Build(RightSon(node), mid + 1, right);
            seg_tree[node] = max(seg_tree[LeftSon(node)], seg_tree[RightSon(node)]);
        }
    }
    void Update(int node, int left, int right, const int& pos, const int& val) {
        if (left == right) {
            seg_tree[node] = val;
        }
        else {
            int mid = (left + right) / 2;
            if (pos <= mid) {
                Update(LeftSon(node), left, mid, pos, val);
            }
            else {
                Update(RightSon(node), mid + 1, right, pos, val);
            }
            seg_tree[node] = max(seg_tree[LeftSon(node)], seg_tree[RightSon(node)]);
        }
    }
    int Query(int node, int left, int right, const int& LeftQuery, const int& RightQuery) {
        if (LeftQuery <= left && right <= RightQuery) {
            return seg_tree[node];
        }
        else {
            int mid = (left + right) / 2;
            int answer = -(1 << 30);
            if (LeftQuery <= mid) {
                answer = max(answer, Query(LeftSon(node), left, mid, LeftQuery, RightQuery));
            }
            if (RightQuery > mid) {
                answer = max(answer, Query(RightSon(node), mid + 1, right, LeftQuery, RightQuery));
            }
            return answer;
        }
    }
public:
    SegmentTree(vector <int> v) {
        values = v;
        nodes = values.size() - 1;
        seg_tree = vector <int>(4 * nodes, -(1 << 30));
        Build(1, 1, nodes);
    }
    void Update(const int& pos, const int& val) {
        return Update(1, 1, nodes, pos, val);
    }
    int Query(const int& LeftQuery, const int& RightQuery) {
        return Query(1, 1, nodes, LeftQuery, RightQuery);
    }
        
};

int main() {
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin >> N >> M;
    vector <int> v(N + 1, 0);
    for (int i = 1; i <= N; ++i) {
        fin >> v[i];
    }
    SegmentTree s(v);
    for (int i = 1; i <= M; ++i) {
        int type;
        fin >> type;
        if (type == 0) {
            int left, right;
            fin >> left >> right;
            fout << s.Query(left, right) << "\n";
        }
        else {
            int pos, val;
            fin >> pos >> val;
            s.Update(pos, val);
        }
    };
    fin.close();
    fout.close();
    return 0;
}