compro_library

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

View the Project on GitHub siro53/compro_library

:heavy_check_mark: data-structure/sum2D.hpp

Verified with

Code

#pragma once

#include <cassert>
#include <vector>

template <typename T> class sum2D {
  public:
    sum2D() = default;
    explicit sum2D(int height, int width)
        : sum(height + 1, std::vector<T>(width + 1, 0)), isBuilt(false) {}
    void add(int row, int column, T val) {
        assert(0 <= row + 1 && row + 1 < (int)sum.size());
        assert(0 <= column + 1 && column + 1 < (int)sum[0].size());
        sum[row + 1][column + 1] += val;
    }
    void build() {
        for(int i = 1; i < (int)sum.size(); i++) {
            for(int j = 1; j < (int)sum[0].size(); j++) {
                sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
            }
        }
        isBuilt = true;
    }
    T get_sum(int row_l, int row_r, int column_l, int column_r) const {
        assert(row_l <= row_r);
        assert(column_l <= column_r);
        assert(isBuilt);
        return (sum[row_r][column_r] - sum[row_l][column_r] -
                sum[row_r][column_l] + sum[row_l][column_l]);
    }

  private:
    std::vector<std::vector<T>> sum;
    bool isBuilt;
};
#line 2 "data-structure/sum2D.hpp"

#include <cassert>
#include <vector>

template <typename T> class sum2D {
  public:
    sum2D() = default;
    explicit sum2D(int height, int width)
        : sum(height + 1, std::vector<T>(width + 1, 0)), isBuilt(false) {}
    void add(int row, int column, T val) {
        assert(0 <= row + 1 && row + 1 < (int)sum.size());
        assert(0 <= column + 1 && column + 1 < (int)sum[0].size());
        sum[row + 1][column + 1] += val;
    }
    void build() {
        for(int i = 1; i < (int)sum.size(); i++) {
            for(int j = 1; j < (int)sum[0].size(); j++) {
                sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
            }
        }
        isBuilt = true;
    }
    T get_sum(int row_l, int row_r, int column_l, int column_r) const {
        assert(row_l <= row_r);
        assert(column_l <= column_r);
        assert(isBuilt);
        return (sum[row_r][column_r] - sum[row_l][column_r] -
                sum[row_r][column_l] + sum[row_l][column_l]);
    }

  private:
    std::vector<std::vector<T>> sum;
    bool isBuilt;
};
Back to top page