Library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ebi-fly13/Library

:heavy_check_mark: test/aoj/aoj_1068_2.test.cpp

Depends on

Code

#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1068"

#include <iostream>
#include <vector>

#include "../../data_structure/sparse_table_2d.hpp"

int op(int a, int b) {
    return a < b ? a : b;
}

int main() {
    int r, c, q;
    while (std::cin >> r >> c >> q, !(r == 0 && c == 0 && q == 0)) {
        std::vector grid(r, std::vector<int>(c));
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                std::cin >> grid[i][j];
            }
        }
        ebi::sparse_table_2d<int, op> st2d(grid);
        while (q--) {
            int l, d, r, u;
            std::cin >> l >> d >> r >> u;
            r++;
            u++;
            std::cout << st2d.prod(l, d, r, u) << '\n';
        }
    }
}
#line 1 "test/aoj/aoj_1068_2.test.cpp"
#define PROBLEM "https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1068"

#include <iostream>
#include <vector>

#line 2 "data_structure/sparse_table_2d.hpp"

#include <cassert>
#line 5 "data_structure/sparse_table_2d.hpp"

namespace ebi {

template <class S, S (*op)(S, S)> struct sparse_table_2d {
    sparse_table_2d(const std::vector<std::vector<S>> &table) {
        h = table.size();
        w = h > 0 ? table[0].size() : 0;
        lg_table.resize(std::max(h, w) + 1);
        lg_table[0] = lg_table[1] = 0;
        for (int i = 2; i <= std::max(h, w); i++)
            lg_table[i] = lg_table[i >> 1] + 1;
        lg_h = lg_table[h];
        lg_w = lg_table[w];
        st = std::vector(
            lg_h + 1, std::vector(lg_w + 1, std::vector(h, std::vector<S>(w))));
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                st[0][0][i][j] = table[i][j];
            }
        }
        for (int k = 0; (1 << k) <= h; k++) {
            for (int l = 0; (1 << l) <= w; l++) {
                if (k == 0 && l == 0) continue;
                for (int i = 0; i + (1 << k) <= h; i++) {
                    for (int j = 0; j + (1 << l) <= w; j++) {
                        if (k > 0)
                            st[k][l][i][j] =
                                op(st[k - 1][l][i][j],
                                   st[k - 1][l][i + (1 << (k - 1))][j]);
                        else
                            st[k][l][i][j] =
                                op(st[k][l - 1][i][j],
                                   st[k][l - 1][i][j + (1 << (l - 1))]);
                    }
                }
            }
        }
    }

    S prod(int l, int d, int r, int u) const {
        assert(l < r && d < u);
        int lg_lr = lg_table[r - l];
        int lg_du = lg_table[u - d];
        return op(
            op(st[lg_lr][lg_du][l][d], st[lg_lr][lg_du][r - (1 << lg_lr)][d]),
            op(st[lg_lr][lg_du][l][u - (1 << lg_du)],
               st[lg_lr][lg_du][r - (1 << lg_lr)][u - (1 << lg_du)]));
    }

  private:
    int h, w;
    int lg_h, lg_w;
    std::vector<int> lg_table;
    std::vector<std::vector<std::vector<std::vector<S>>>> st;
};

}  // namespace ebi
#line 7 "test/aoj/aoj_1068_2.test.cpp"

int op(int a, int b) {
    return a < b ? a : b;
}

int main() {
    int r, c, q;
    while (std::cin >> r >> c >> q, !(r == 0 && c == 0 && q == 0)) {
        std::vector grid(r, std::vector<int>(c));
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                std::cin >> grid[i][j];
            }
        }
        ebi::sparse_table_2d<int, op> st2d(grid);
        while (q--) {
            int l, d, r, u;
            std::cin >> l >> d >> r >> u;
            r++;
            u++;
            std::cout << st2d.prod(l, d, r, u) << '\n';
        }
    }
}
Back to top page