imos法

概要

要素数$N$の数列について,区間への加算を$O(1)$で行い,$O(N)$の処理を行うことで各値が$O(1)$で得られる.

ソースコード

template<class T> struct Imos{
    vector<T> A;
    int N;
    constexpr Imos(int N){
        this -> N = N;
        init();
    }
    constexpr void init(){
        A.resize(N+1);
        fill(A.begin(),A.end(),0);
    }
    /*[l,r]にxを加算*/
    constexpr void add(int l,int r,T x){
        A[l] += x;
        A[r+1] += -x;
    }
    constexpr void calc(){
        for(int i=0;i<N;i++){
            A[i+1] += A[i];
        }
    }
    constexpr T get(int i){
        return A[i];
    }
};