Cod sursa(job #2622071)

Utilizator lauratenderLaura Tender lauratender Data 31 mai 2020 14:02:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

std::ifstream in ("arbint.in");
std::ofstream out ("arbint.out");

int maxim (int a, int b)
{
    return (a > b) ? a : b;
}

class AInt
{
    static const int MAXN = 100000;
    int arb[4 * MAXN];
public:
    void Update(int poz, int st, int dr, int index, int val);
    int Query (int poz, int st, int dr, int stq, int drq);
};

void AInt::Update(int poz, int st, int dr, int index, int val)
{
    if (st == dr){
        arb[poz] = val;
        return;
    }
    int mij = (st + dr)/2;
    if (index <= mij)
        Update(poz*2, st, mij, index, val);
    else
        Update(poz*2+1, mij+1, dr, index, val);
    arb[poz] = maxim( arb[poz * 2], arb[poz * 2 + 1] );
}
int AInt::Query (int poz, int st, int dr, int stq, int drq)
{
    if (stq <= st && dr <= drq) {
		return arb[poz];
	}
	int mij = (st + dr) / 2;

	if (drq <= mij)
		return Query(poz * 2, st, mij, stq, drq);

    if (stq > mij)
		return Query(poz * 2 + 1, mij + 1, dr, stq, drq);

    return maxim(Query(poz * 2, st, mij, stq, drq), Query(poz * 2 + 1, mij + 1, dr, stq, drq));
}

int main()
{
    AInt aint;
    int N, M, op, a, b;
    in >> N >> M;

    for (int i = 0; i < N; ++i) {
		int x;
		in >> x;
		aint.Update(1, 0, N - 1, i, x);
	}

	for (int i = 0; i < M; ++i){
        in >> op >> a >> b;
        if ( op == 0 )
            out << aint.Query(1, 0, N - 1, a - 1, b - 1) << '\n';
        if ( op == 1 )
            aint.Update(1, 0, N - 1, a - 1, b);
	}
    return 0;
}