Cod sursa(job #2727621)

Utilizator vansJos da pa perete vans Data 22 martie 2021 10:55:20
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5 + 5;

int t, a[NMAX + 1], segt[4 * NMAX + 1], n, x, y, op;

inline void generSegt(const int ST = 1, const int DR = n, const int SEGTI = 1) {
    if(ST == DR) {
        segt[SEGTI] = a[ST];
        return;
    }
    const int MIJ = (ST + DR) / 2;
    generSegt(ST, MIJ, 2 * SEGTI);
    generSegt(MIJ + 1, DR, 2 * SEGTI + 1);
    segt[SEGTI] = max(segt[2 * SEGTI], segt[2 * SEGTI + 1]);
}

inline void updSegt(const int ST, const int DR, const int POZ, const int VAL, const int SEGTI = 1) {
    if(ST == DR) {
        segt[SEGTI] = VAL;
        return;
    }
    const int MIJ = (ST + DR) / 2;
    if(POZ <= MIJ) updSegt(ST, MIJ, POZ, VAL, 2 * SEGTI);
    else updSegt(MIJ + 1, DR, POZ, VAL, 2 * SEGTI + 1);
    segt[SEGTI] = max(segt[2 * SEGTI], segt[2 * SEGTI + 1]);
}

inline int querySegt(const int QST, const int QDR, const int ST, const int DR, const int SEGTI = 1) {
    if(ST > DR) return 0;
    if(ST == QST && DR == QDR) return segt[SEGTI];
    const int QMIJ = (QST + QDR)/ 2;
    return max(querySegt(QST, QMIJ, ST, min(DR, QMIJ), 2 * SEGTI),
               querySegt(QMIJ + 1, QDR, max(ST, QMIJ + 1), DR, 2 * SEGTI + 1));
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    scanf("%d%d", &n, &t);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    generSegt();

    while(t--) {
        scanf("%d%d%d", &op, &x, &y);
        if(!op) printf("%d\n", querySegt(1, n, x, y));
        else updSegt(1, n, x, y);
    }
    return 0;
}