Cod sursa(job #1977031)

Utilizator taigi100Cazacu Robert taigi100 Data 4 mai 2017 21:18:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
/*
    Keep It Simple!
*/
#include <fstream>

using namespace std;

const int MAX_N = 100005;

int arbint[4*MAX_N+1];
int N, M, mx;
ifstream f("arbint.in");

void Update(int node, int left, int right, int val, int idx) {
    if (left == right) {
        arbint[node] = val;
        return;
    }
    int mij = (left + right)/2;
    if (idx <= mij)
        Update(2*node, left, mij, val, idx);
    else
        Update(2*node + 1, mij + 1, right, val, idx);

    arbint[node] = max(arbint[2*node], arbint[2*node+1]);
}

void Query(int node, int left, int right, int a, int b) {
    if (a <= left && right <= b) {
        if (mx < arbint[node]) mx = arbint[node];
        return;
    }
    int mij = (left + right) / 2;
    if (a <= mij) Query(2*node, left, mij, a, b);
    if (mij < b) Query(2*node+1, mij + 1, right, a, b);
}

void MakeArbInt() {
    f >> N >> M;
    int x;
    for (int i = 1; i <= N; ++i) {
        f >> x;
        Update(1, 1, N, x, i);
    }
}

void Solve() {
    MakeArbInt();
    int c, x, y;
    ofstream g("arbint.out");
    for (int i = 1; i <= M; ++i) {
        f >> c >> x >> y;
        if (c)
            Update(1,1,N,y,x);
        else {
            mx = 0;
            Query(1,1,N,x,y);
            g << mx << '\n';
        }
    }
}

int main()
{
    Solve();
    return 0;
}