#pragma once
// S ... size_type// T ... value_typetemplate<typenameS,typenameT>structFenwickRangeTree{structBIT{intN;vector<T>data;BIT()=default;BIT(intsize){init(size);}voidinit(intsize){N=size;data.assign(N+1,0);}voidadd(intk,Tx){for(++k;k<=N;k+=k&-k)data[k]+=x;}Tsum(intk)const{Tret=T();for(;k;k-=k&-k)ret+=data[k];returnret;}inlineTsum(intl,intr)const{Tret=T();while(l!=r){if(l<r){ret+=data[r];r-=r&-r;}else{ret-=data[l];l-=l&-l;}}returnret;}};usingP=pair<S,S>;SN,M;vector<BIT>bit;vector<vector<S>>ys;vector<P>ps;FenwickRangeTree()=default;voidadd_point(Sx,Sy){ps.push_back(make_pair(x,y));}voidbuild(){sort(begin(ps),end(ps));ps.erase(unique(begin(ps),end(ps)),end(ps));N=ps.size();bit.resize(N+1);ys.resize(N+1);for(inti=0;i<=N;++i){for(intj=i+1;j<=N;j+=j&-j)ys[j].push_back(ps[i].second);sort(begin(ys[i]),end(ys[i]));ys[i].erase(unique(begin(ys[i]),end(ys[i])),end(ys[i]));bit[i].init(ys[i].size());}}intid(Sx)const{returnlower_bound(begin(ps),end(ps),make_pair(x,S()),[](constP&a,constP&b){returna.first<b.first;})-begin(ps);}intid(inti,Sy)const{returnlower_bound(begin(ys[i]),end(ys[i]),y)-begin(ys[i]);}voidadd(Sx,Sy,Ta){inti=lower_bound(begin(ps),end(ps),make_pair(x,y))-begin(ps);assert(ps[i]==make_pair(x,y));for(++i;i<=N;i+=i&-i)bit[i].add(id(i,y),a);}Tsum(Sx,Sy)const{Tret=T();for(inta=id(x);a;a-=a&-a)ret+=bit[a].sum(id(a,y));returnret;}Tsum(Sxl,Syl,Sxr,Syr)const{Tret=T();inta=id(xl),b=id(xr);while(a!=b){if(a<b){ret+=bit[b].sum(id(b,yl),id(b,yr));b-=b&-b;}else{ret-=bit[a].sum(id(a,yl),id(a,yr));a-=a&-a;}}returnret;}};/*
* @brief 領域木(Binary Indexed Tree)
*/
#line 2 "data-structure-2d/fenwick-tree-on-range-tree.hpp"
// S ... size_type// T ... value_typetemplate<typenameS,typenameT>structFenwickRangeTree{structBIT{intN;vector<T>data;BIT()=default;BIT(intsize){init(size);}voidinit(intsize){N=size;data.assign(N+1,0);}voidadd(intk,Tx){for(++k;k<=N;k+=k&-k)data[k]+=x;}Tsum(intk)const{Tret=T();for(;k;k-=k&-k)ret+=data[k];returnret;}inlineTsum(intl,intr)const{Tret=T();while(l!=r){if(l<r){ret+=data[r];r-=r&-r;}else{ret-=data[l];l-=l&-l;}}returnret;}};usingP=pair<S,S>;SN,M;vector<BIT>bit;vector<vector<S>>ys;vector<P>ps;FenwickRangeTree()=default;voidadd_point(Sx,Sy){ps.push_back(make_pair(x,y));}voidbuild(){sort(begin(ps),end(ps));ps.erase(unique(begin(ps),end(ps)),end(ps));N=ps.size();bit.resize(N+1);ys.resize(N+1);for(inti=0;i<=N;++i){for(intj=i+1;j<=N;j+=j&-j)ys[j].push_back(ps[i].second);sort(begin(ys[i]),end(ys[i]));ys[i].erase(unique(begin(ys[i]),end(ys[i])),end(ys[i]));bit[i].init(ys[i].size());}}intid(Sx)const{returnlower_bound(begin(ps),end(ps),make_pair(x,S()),[](constP&a,constP&b){returna.first<b.first;})-begin(ps);}intid(inti,Sy)const{returnlower_bound(begin(ys[i]),end(ys[i]),y)-begin(ys[i]);}voidadd(Sx,Sy,Ta){inti=lower_bound(begin(ps),end(ps),make_pair(x,y))-begin(ps);assert(ps[i]==make_pair(x,y));for(++i;i<=N;i+=i&-i)bit[i].add(id(i,y),a);}Tsum(Sx,Sy)const{Tret=T();for(inta=id(x);a;a-=a&-a)ret+=bit[a].sum(id(a,y));returnret;}Tsum(Sxl,Syl,Sxr,Syr)const{Tret=T();inta=id(xl),b=id(xr);while(a!=b){if(a<b){ret+=bit[b].sum(id(b,yl),id(b,yr));b-=b&-b;}else{ret-=bit[a].sum(id(a,yl),id(a,yr));a-=a&-a;}}returnret;}};/*
* @brief 領域木(Binary Indexed Tree)
*/