Cod sursa(job #2333732)

Utilizator andysoloAndrei Solo andysolo Data 1 februarie 2019 21:23:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include<cstdio>
#include <vector>
#include <cstring>
/* #include "Euclid.cpp"
#include "EuclidExtended.cpp"
#include "LCS.cpp"
#include "RabinKarp.cpp"
#include "KMP.cpp"
#include "Arbint.cpp" */
using namespace std;

#include <cstdio>
#include <algorithm>

using namespace std;

class Arbint {

#define NMAX 100000+5

private:

    int N, M;
    int ai[4 * NMAX + 70];
    int maxi;

    void update(int nod, int st, int dr, int a, int b, int k) {
        if (a <= st && dr <= b) {
            ai[nod] = k;
            return;
        } else {
            int mij = (st + dr) / 2;
            if (a <= mij)
                update(nod * 2, st, mij, a, b, k);
            else
                update(nod * 2 + 1, mij + 1, dr, a, b, k);
            ai[nod] = max(ai[nod*2],ai[nod*2+1]);
        }
    }

    void query(int nod, int st, int dr, int a, int b) {
        if (a <= st && dr <= b) {
            maxi = max(maxi, ai[nod]);
            return;
        } else {
            int mij = (st + dr) / 2;
            if (a <= mij)
                query(nod * 2, st, mij, a, b);
            if (mij < b)
                query(nod * 2 + 1, mij + 1, dr, a, b);
        }
    }

public:

    void arbint_main() {
        freopen("arbint.in", "r", stdin);
        freopen("arbint.out", "w", stdout);

        scanf("%d %d", &N, &M);
        int x;

        for (int i = 1; i <= N; i++)
            scanf("%d", &x), update(1, 1, N, i, i, x);

        for (int i = 1; i <= M; i++) {
            int p, a, b;
            scanf("%d %d %d", &p, &a, &b);
            if (p == 0) {
                maxi = -1;
                query(1, 1, N, a, b);
                printf("%d\n", maxi);
            } else update(1, 1, N, a, a, b);
        }

    }

} arbint;

int main()
{
    arbint.arbint_main();
    return 0;
}