Cod sursa(job #2083314)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 7 decembrie 2017 15:37:52
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

const int MAX = 100003;
int N, M, x, cer, arg1, arg2, arbore[2 * MAX + 1];
void update(int poz, int val, int nod, int st, int dr) {
    if(st == dr) {
        arbore[nod] = val;
    } else {
        int mij = (st + dr) / 2;
        if(poz <= mij) update(poz, val, nod * 2, st, mij);
        else           update(poz, val, nod * 2 + 1, mij + 1, dr);
        arbore[nod] = max(arbore[nod * 2], arbore[nod * 2 + 1]);
    }
}
int find(int a, int b, int nod, int st, int dr) {
    if(a <= st && b >= dr) return arbore[nod];

    int mij = (st + dr) / 2, res1 = -1, res2 = -1;
    if(a <= mij) res1 = find(a, b, nod * 2, st, mij);
    if(b > mij) res2 = find(a, b, nod * 2 + 1, mij + 1, dr);
    return max(res1, res2);
}
int main()
{
    f >> N >> M;
    for(int i = 1; i <= N; i++) {
        f >> x;
        update(i, x, 1, 1, N);
    }
    for(int i = 1; i <= M; i++) {
        f >> cer >> arg1 >> arg2;
        if(cer == 1) update(arg1, arg2, 1, 1, N);
        else         g << find(arg1, arg2, 1, 1, N) << "\n";
    }
    return 0;
}