Cod sursa(job #2762289)

Utilizator sinai2008Belu Ianis sinai2008 Data 6 iulie 2021 12:17:04
Problema Arbori de intervale Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, v[100320], x, a, b, DIM, Max[320];
int gaseste(int i) {
    return i / DIM + (i % DIM != 0);
}
void update(int pos, int val) {
    v[pos] = val;
    int grupa = gaseste(pos);
    Max[grupa] = 0;
    for (int i = (grupa-1)*DIM+1; i <= grupa * DIM; i++)
        Max[grupa] = max(Max[grupa], v[i]);
}
int maxim(int st, int dr) {
    int MAX = 0;
    int grupaSt = gaseste(st);
    int grupaDr = gaseste(dr);
    if (grupaDr == grupaSt) {
        for (int i = st; i <= dr; i++)
            MAX = max(MAX, v[i]);
        return MAX;
    }
    for (int i = st; i <= grupaSt * DIM; i++)
        MAX = max(MAX, v[i]);
    for (int i = grupaSt+1; i <= grupaDr-1; i++)
        MAX = max(MAX, Max[i]);
    for (int i = (grupaDr-1)*DIM+1; i <= dr; i++)
        MAX = max(MAX, v[i]);
    return MAX;
}
int main() {
    f >> n >> m;
    DIM = sqrt(n);
    for (int i = 1; i <= n; i++) {
        f >> v[i];
        int grupa = gaseste(i);
        Max[grupa] = max(grupa, v[i]);
    }
    for (int i = 1; i <= m; i++) {
        f >> x >> a >> b;
        if (!x)
            g << maxim(a, b) << '\n';
        else
            update(a, b);
    }
    return 0;
}