累積和

概要

静的な数列の区間和を高速で求める.

計算量

  • 構築: $O(N)$
  • クエリ:$O(1)$

ソースコード

template<class T> struct CumulativeSum{
    size_t n;
    vector<T> A;
    CumulativeSum(size_t n){
        this->n=n;
        init();
    };
    void init(){
        A.resize(n+1);
    }
    void add(int i,T x){
        A[i+1]=x;
    }
    void build(){
        for(int i=0;i<n;i++){
            A[i+1]+=A[i];
        }
    }
    /*[l,r)の総和を求める*/
    T query(int l,int r){
        return A[r]-A[l];
    }
};