Cod sursa(job #1974345)

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

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()
{
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    ios::sync_with_stdio(false);

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

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

    return 0;
}