#include #include using namespace std; namespace my{ #define eb emplace_back #define LL(...) ll __VA_ARGS__;lin(__VA_ARGS__) #define FO(n) for(ll ij=n;ij-->0;) #define FOR(i,...) for(auto[i,i##stop,i##step]=range(0,__VA_ARGS__);isync_with_stdio(0);cout<r{0,0,1};ll I=0;((r[I++]=a),...);if(!s&&I==1)swap(r[0],r[1]);r[0]-=s;if(s)r[2]*=-1;return r;} constexpr char newline=10; constexpr char space=32; constexpr auto odd(auto x){return x&1;} auto max(auto...a){return max(initializer_list>{a...});} auto min(auto...a){return min(initializer_list>{a...});} templatestruct pair{ A a;B b; pair()=default; pair(A a,B b):a(a),b(b){} pair(const std::pair&p):a(p.first),b(p.second){} auto operator<=>(const pair&)const=default; pair operator+(const pair&p)const{return{a+p.a,b+p.b};} friend istream&operator>>(istream&i,pair&p){return i>>p.a>>p.b;} friend ostream&operator<<(ostream&o,const pair&p){return o<>auto&sort(auto&a,F f={}){ranges::sort(a,f);return a;} templateostream&operator<<(ostream&o,const multiset&s){fe(s,e)o<struct multiset:std::multiset{ multiset(const initializer_list&a={}){fe(a,e)this->emplace(e);} multiset(const vector&a){fe(a,e)this->emplace(e);} ll size()const{return std::multiset::size();} auto between(const T&l,const T&r)const{return pair{this->lower_bound(l),this->lower_bound(r)};} T back()const{assert(size());return*this->rbegin();} }; templatestruct set:multiset{ set(const initializer_list&a={}){fe(a,e)this->emplace(e);} set(const vector&a){fe(a,e)this->emplace(e);} templateauto emplace(A&&...a){ T x(std::forward(a)...); if(auto p=this->find(x);p!=this->end())return pair{p,0}; return pair{multiset::emplace(x),1}; } }; templateauto pack_kth(const auto&...a){return get(make_tuple(a...));} templateauto pack_slice(const auto&...a){return[&](index_sequence){return array{get(forward_as_tuple(a...))...};}(make_index_sequence{});} templateconcept vectorial=is_base_of_v,V>; templatestruct vec_attr{using core_type=T;static constexpr int rank=0;}; templatestruct vec_attr{using core_type=typename vec_attr::core_type;static constexpr int rank=vec_attr::rank+1;}; templateusing core_t=vec_attr::core_type; templateistream&operator>>(istream&i,vector&v){fe(v,e)i>>e;return i;} templateostream&operator<<(ostream&o,const vector&v){fe(v,e)o<?newline:space);return o;} templatestruct vec; templatestruct tensor_helper{using type=vec::type>;}; templatestruct tensor_helper<0,T>{using type=T;}; templateusing tensor=typename tensor_helper::type; templatestruct vec:vector{ using vector::vector; vec(const vector&v){vector::operator=(v);} templaterequires(sizeof...(A)>=3)vec(A...a){const ll n=sizeof...(a)-1;auto t=pack_slice(a...);ll s[n];fo(i,n)s[i]=t[i];*this=make_vec(s,pack_kth(a...));} templatestatic auto make_vec(const ll(&s)[n],T x){if constexpr(i==n-1)return vec(s[i],x);else{auto X=make_vec(s,x);return vec(s[i],X);}} vec&operator^=(const vec&u){this->insert(this->end(),u.begin(),u.end());return*this;} vec operator^(const vec&u)const{return vec{*this}^=u;} vec&operator+=(const vec&u){vec&v=*this;assert(v.size()==u.size());fo(i,v.size())v[i]+=u[i];return v;} vec&operator-=(const vec&u){vec&v=*this;assert(v.size()==u.size());fo(i,v.size())v[i]-=u[i];return v;} vec operator+(const vec&u)const{return vec{*this}+=u;} vec operator-(const vec&u)const{return vec{*this}-=u;} vec&operator++(){fe(*this,e)++e;return*this;} vec&operator--(){fe(*this,e)--e;return*this;} vec operator-()const{vec v=*this;fe(v,e)e=-e;return v;} vec&operator%=(auto M){vec&v=*this;fe(v,e)e%=M;return v;} vec operator%(auto M)const{return vec{*this}%=M;} ll size()const{return vector::size();} auto lower_bound(const V&x)const{return std::lower_bound(this->begin(),this->end(),x);} auto between(const V&x,const V&y)const{return pair{this->lower_bound(x),this->lower_bound(y)};} auto between_count(const V&x,const V&y)const{auto[p,q]=between(x,y);return my::max(q-p,0);} auto scan(const auto&f)const{pair,bool>r{};fe(*this,e)if constexpr(!vectorial)r.b?f(r.a,e),r:r={e,1};else if(auto s=e.scan(f);s.b)r.b?f(r.a,s.a),r:r=s;return r;} auto max()const{return scan([](auto&a,auto b){ab?a=b:0;;}).a;} template>auto sort(F f={})const{vec v=*this;ranges::sort(v,f);return v;} }; templaterequires(sizeof...(A)>=2)vec(A...a)->vec(declval>()))>>>; vec(ll)->vec; void lin(auto&...a){(cin>>...>>a);} void dec(auto&...a){((--a),...);} void sort(auto&...a){vec>v;(v.eb(a),...);sort(v);ll I=0;((a=v[I++]),...);} templatestruct grid{ ll H,W; grid(ll H,ll W):H(H),W(W){} ll sum_count(ll k)const{return min(k+1,H+W-1-k);} ll diff_count(ll k)const{return min(H-k,W+k);} ll sum_id(const pair&p)const{return p.a+p.b;} ll diff_id(const pair&p)const{return p.a-p.b;} ll sum_count(const pair&p)const{return sum_count(sum_id(p));} ll diff_count(const pair&p)const{return diff_count(diff_id(p));} auto sum_left_down(ll k)const{return k<=H-1?pair{k,0LL}:pair{H-1,k-(H-1)};} auto sum_right_up(ll k)const{return k<=W-1?pair{0LL,k}:pair{k-(W-1),W-1};} auto sum_cross_diff_range(ll k)const{return pair{diff_id(sum_right_up(k)),diff_id(sum_left_down(k))+1};} }; void pp(auto&&...a){ll n=sizeof...(a);((cout<0,space)),...);cout<g(K,K); ll ans=0; setsum_set,diff_set; fo(N){ LL(x,y);dec(x,y); if(!sum_set.contains(x+y)){ sum_set.emplace(x+y); ans+=g.sum_count(x+y); } if(!diff_set.contains(x-y)){ diff_set.emplace(x-y); ans+=g.diff_count(x-y); } } array,2>diff_vec; fe(diff_set,k)diff_vec[odd(k)].eb(k); fo(f,2)sort(diff_vec[f]); // 交点の個数を求めて引く.上でダブルカウントしているので. fe(sum_set,k){ auto[l,r]=g.sum_cross_diff_range(k); ans-=diff_vec[odd(k)].between_count(l,r); } pp(ans); }}