Cod sursa(job #3250242)

Utilizator MikeStrikeAgache Mihai MikeStrike Data 19 octombrie 2024 19:26:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cassert>
using namespace std;

#define dim 100001


struct SegmentTree {
    int size;        
    vector<int> tree; 


    SegmentTree(int n) {
        size = n;
        tree.resize(4 * size + 66);
    }


    void Update(int nod, int left, int right, int pos, int val) {
        if (left == right) {
            tree[nod] = val;
            return;
        }

        int mid = (left + right) / 2;
        if (pos <= mid) {
            Update(2 * nod, left, mid, pos, val);
        } else {
            Update(2 * nod + 1, mid + 1, right, pos, val);
        }

        tree[nod] = Maxim(tree[2 * nod], tree[2 * nod + 1]);
    }


    int Query(int nod, int left, int right, int start, int finish) {
        if (start <= left && right <= finish) {
            return tree[nod];
        }

        int mid = (left + right) / 2;
        int maxVal = -1;

        if (start <= mid) {
            maxVal = Maxim(maxVal, Query(2 * nod, left, mid, start, finish));
        }
        if (mid < finish) {
            maxVal = Maxim(maxVal, Query(2 * nod + 1, mid + 1, right, start, finish));
        }

        return maxVal;
    }


    static int Maxim(int a, int b) {
        return (a > b) ? a : b;
    }
};

int main() {
    int N, M, X, A, B;
    ifstream in ("arbint.in");
    ofstream out ("arbint.out");

    in >> N >> M;
    

    SegmentTree segmentTree(N);


    for (int i = 1; i <= N; i++) {
        in >> X;
        segmentTree.Update(1, 1, N, i, X);
    }


    for (int i = 1; i <= M; i++) {
        in >> X >> A >> B;
        if (X == 0) {
            int maxVal = segmentTree.Query(1, 1, N, A, B);
            out << maxVal << endl;
        } else {
            segmentTree.Update(1, 1, N, A, B);
        }
    }

    return 0;
}