Cod sursa(job #2145498)

Utilizator oso.andinoooIonut Stan oso.andinooo Data 27 februarie 2018 13:31:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fi("arbint.in");
ofstream fo("arbint.out");

const int N = 1e5 + 5, SQRT = 320;

int v[N], bucks[SQRT];

int n, q;

static int query(int st, int dr) {
    int ant, buck_st, buck_dr;

    ant = 0;
    if (st / SQRT == dr / SQRT) {
        for (int i = st; i <= dr; ++i)
            ant = max(ant, v[i]);
        return ant; }

    buck_st = st / SQRT;
    buck_dr = dr / SQRT;

    for (int i = st; i / SQRT == buck_st; ++i)
        ant = max(ant, v[i]);
    for (int i = dr; i / SQRT == buck_dr; --i)
        ant = max(ant, v[i]);
    for (int i = buck_st + 1; i <= buck_dr - 1; ++i)
        ant = max(ant, bucks[i]);

    return ant; }

static void update(int pos, int val) {
    int buck, s, e;

    buck = pos / SQRT;
    s = pos - pos % SQRT;
    e = s + SQRT - 1;

    v[pos] = val;
    bucks[buck] = 0;
    for (int i = s; i <= e; ++i)
        bucks[buck] = max(bucks[buck], v[i]);  }

int main() {
    int op, l, r, pos, x;

    fi >> n >> q;
    for (int i = 0; i < n; ++i) {
        fi >> v[i];
        bucks[i / SQRT] = max(bucks[i / SQRT], v[i]); }

    while (q--) {
        fi >> op;
        switch (op) {
        case 0: { // query
            fi >> l >> r;
            fo << query(--l, --r) << '\n';
            break; }
        case 1: { // update
            fi >> pos >> x;
            update(--pos, x);
            break; } } }

    return 0; }