Cod sursa(job #2115132)

Utilizator amaliarebAmalia Rebegea amaliareb Data 26 ianuarie 2018 12:57:15
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int MaxN = 100005;
int v[MaxN], n, m, maxi[400], bsize, nrb;

void update(int poz, int val) {
    v[poz] = val;
    int bucket = (poz - 1) / bsize + 1;
    if (bucket <= nrb) {
        if (maxi[bucket] <= v[poz]) maxi[bucket] = v[poz];
        else {
            maxi[bucket] = 0;
            for (int j = 1; j <= bsize; ++j) maxi[bucket] = max(maxi[bucket], v[(bucket - 1) * bsize + j]);
        }
    }
}

int query(int l, int r) {
    int ans = 0;
    if (r - l + 1 < bsize) {
        for (int i = l; i <= r; ++i) ans = max(ans, v[i]);
        return ans;
    }
    int bucket = (l - 1) / bsize + 1;
    while (l <= r && l % bsize != 1) {
        ans = max(ans, v[l]);
        ++l;
    }
    bucket = (r - 1) / bsize;
    while (r >= l && r % bsize) {
        ans = max(ans, v[r]);
        --r;
    }
    while (l < r) {
        ans = max(ans, maxi[(l - 1) / bsize + 1]);
        l += bsize;
    }
    return ans;
}

int main()
{
    f >> n >> m;
    for (int i = 1; i <= n; ++i) f >> v[i];
    bsize = sqrt(n);
    for (int i = 1; bsize * i <= n; ++i)
    for (int j = 1; j <= bsize; ++j) {
        maxi[i] = max(maxi[i], v[bsize * (i - 1) + j]);
        nrb = i;
    }
    for (int i = 1; i <= m; ++i) {
        int c, a, b;
        f >> c >> a >> b;
        if (c == 0) g << query(a, b) << '\n';
        else update(a, b);
    }
    return 0;
}