Cod sursa(job #2455360)

Utilizator urweakurweak urweak Data 11 septembrie 2019 15:28:20
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

int N, M, MaxArb[2*131072-1], Val, Pos, maxim = -1, start, finish;

int Maxim(int a, int b){
    if(a > b) return a;
    return b;
}

void Update(int nod, int left, int right){
    if(left == right){
        MaxArb[nod] = Val;
        return;
    }

    int div = (left + right) / 2;
    if(Pos <= div) Update(2 * nod, left , div);
    else Update(2 * nod + 1, div + 1, right);
    MaxArb[nod] = Maxim(MaxArb[2 * nod], MaxArb[2 * nod + 1]);
}

void Query(int nod, int left, int right){
    if(start <= left && right <= finish){
        if(maxim < MaxArb[nod]) maxim = MaxArb[nod];
        return;
    }
    int div = (left + right) / 2;
    if(start <= div) Query(2 * nod, left, div);
    if(div < finish) Query(2 * nod + 1, div + 1, right);
}

int main()
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");

    cin >> N >> M;
    for(int i = 1; i<=N; i++){
        int x;
        in >> x;
        Val = x, Pos = i;
        Update(1, 1, N);
    }

    for(int i = 1; i <= M; i++){
        int X, A, B;
        in >> X >> A >> B;
        if(X == 0)
        {
            maxim = -1;
            start = A;
            finish = B;
            Query(1, 1, N);
            out << maxim <<"\n";
        }
        else{
            Pos = A;
            Val = B;
            Update(1, 1, N);
        }
    }
    return 0;
}