Cod sursa(job #1974340)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 27 aprilie 2017 13:30:32
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> V;
int answer, newX, pos, A , B;

class SegmentTree{
    public:
    vector<int> elem;

    void resize(int k) {
        elem.resize(4 * k);
    }

    void build(int li, int lf, int pz) {
        if(li == lf) {
            elem[pz] = V[li];
            return;
        }
        int m = li + ((lf - li) >> 1);
        build(li, m, pz << 1);
        build(m + 1, lf, (pz << 1) | 1);
        elem[pz] = max(elem[pz << 1], elem[(pz << 1) | 1]);
    }

    void query(int li, int lf, int pz) {
        if(A <= li && lf <= B) {
            answer = max(answer, elem[pz]);
            return;
        }
        int m =  li + ((lf - li) >> 1);
        if(A <= m)
            query(li, m , pz << 1);
        if(m < B)
            query(m + 1, lf, (pz << 1) | 1);
    }

    void update(int li, int lf, int pz) {
        if(li == lf) {
            elem[pz] = newX;
            return;
        }

        int m =  li + ((lf - li) >> 1);
        if(pos <= m)
            update(li, m, pz << 1);
        else
            update(m + 1, lf, (pz << 1) | 1);

        elem[pz] = max(elem[pz << 1], elem[(pz << 1) | 1]);
    }

}segmentTree;


int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    ios::sync_with_stdio(false);

    int N, M;
    int t,a,b,c;
    cin >> N >> M;
    V.resize(N + 1);
    for(int i = 1; i <= N; ++i)
        cin >> V[i];
    segmentTree.resize(N);
    segmentTree.build(1, N, 1);

    for(int i = 1; i <= M; ++i) {
        cin >> t;
        if(t == 0) {
            cin >> A >> B;
            answer = 0;
            segmentTree.query(1, N, 1);
            cout << answer << "\n";
        }
        else {
            cin >> pos >> newX;
            segmentTree.update(1, N, 1);
        }
    }

    return 0;
}