let menu = ["Home", "Algorithms", "CodeHub", "VNOI Statistics"];

Overview

NKLINEUP - Xếp hàng

Bài này có nhiều cách làm, code bên dưới sử dụng Fenwick Tree để tìm min/max.

main.cpp
Open in Github Download
#include <iostream>
#include <vector>
using namespace std;

void minimize(int &a, int b) {
    if (a > b) a = b;
}
void maximize(int &a, int b) {
    if (a < b) a = b;
}
typedef void (*func)(int &, int);

struct Fenwick {
    int n, init;
    vector<int> f, a;
    func update;

    Fenwick(int n, int val, func func):
        n(n), init(val),
        f(n+1, val), a(n+1),
        update(func) {}

    int get(int l, int r) {
        int result = init;
        while (l <= r) {
            if (r-(r&-r) >= l) update(result, f[r]), r -= r&-r;
            else update(result, a[r]), r -= 1;
        }
        return result;
    }
    void set(int i, int x) {
        a[i] = x;
        for (; i<=n; i += i&-i) update(f[i], x);
    }
};

int main() {
    ios::sync_with_stdio(false); cin.tie(0);

    int n, q; cin >> n >> q;

    Fenwick fmax(n, 0, maximize);
    Fenwick fmin(n, 1e8, minimize);

    for (int i=1; i<=n; i++) {
        int x; cin >> x;
        fmax.set(i, x);
        fmin.set(i, x);
    }

    while (q--) {
        int l, r; cin >> l >> r;
        cout << fmax.get(l, r) - fmin.get(l, r) << endl;
    }

    return 0;
}
Comments