#pragma once
#include<utility>namespacehaar_lib{template<typenameMonoidUpdate>structadd_square_sum{structinternal_type{usingvalue_type=typenameMonoidUpdate::value_type;value_typesum,square_sum;internal_type(value_typevalue):sum(value),square_sum(value*value){}internal_type(value_typesum,value_typesquare_sum):sum(sum),square_sum(square_sum){}};structmonoid_get{usingvalue_type=internal_type;value_typeoperator()()const{return{0,0};};value_typeoperator()(constvalue_type&a,constvalue_type&b){return{a.sum+b.sum,a.square_sum+b.square_sum};}};usingmonoid_update=MonoidUpdate;usingvalue_type_get=typenamemonoid_get::value_type;usingvalue_type_update=typenameMonoidUpdate::value_type;value_type_getoperator()(constvalue_type_get&a,constvalue_type_update&b,intlen)const{return{a.sum+b*len,a.square_sum+b*(2*a.sum+b*len)};}};}// namespace haar_lib