#pragma once
// This file is a fork of AtCoder Library.#define E6NLAQ_LAZYSEGTREE_HPP
#include<cassert>
#include<functional>
#include<vector>#include"internal/bit.hpp"namespacee6nlaq{#if __cplusplus >= 201703L
template<classS,autoop,autoe,classF,automapping,autocomposition,autoid>structlazy_segtree{static_assert(std::is_convertible_v<decltype(op),std::function<S(S,S)>>,"op must work as S(S, S)");static_assert(std::is_convertible_v<decltype(e),std::function<S()>>,"e must work as S()");static_assert(std::is_convertible_v<decltype(mapping),std::function<S(F,S)>>,"mapping must work as F(F, S)");static_assert(std::is_convertible_v<decltype(composition),std::function<F(F,F)>>,"compostiion must work as F(F, F)");static_assert(std::is_convertible_v<decltype(id),std::function<F()>>,"id must work as F()");#else
template<classS,S(*op)(S,S),S(*e)(),classF,S(*mapping)(F,S),F(*composition)(F,F),F(*id)()>structlazy_segtree{#endif
public:lazy_segtree():lazy_segtree(0){}explicitlazy_segtree(intn):lazy_segtree(std::vector<S>(n,e())){}explicitlazy_segtree(conststd::vector<S>&v):_n(int(v.size())){size=(int)internal::bit_ceil((unsignedint)(_n));log=internal::countr_zero((unsignedint)size);d=std::vector<S>(2*size,e());lz=std::vector<F>(size,id());for(inti=0;i<_n;i++)d[size+i]=v[i];for(inti=size-1;i>=1;i--){update(i);}}voidset(intp,Sx){assert(0<=p&&p<_n);p+=size;for(inti=log;i>=1;i--)push(p>>i);d[p]=x;for(inti=1;i<=log;i++)update(p>>i);}Sget(intp){assert(0<=p&&p<_n);p+=size;for(inti=log;i>=1;i--)push(p>>i);returnd[p];}Sprod(intl,intr){assert(0<=l&&l<=r&&r<=_n);if(l==r)returne();l+=size;r+=size;for(inti=log;i>=1;i--){if(((l>>i)<<i)!=l)push(l>>i);if(((r>>i)<<i)!=r)push((r-1)>>i);}Ssml=e(),smr=e();while(l<r){if(l&1)sml=op(sml,d[l++]);if(r&1)smr=op(d[--r],smr);l>>=1;r>>=1;}returnop(sml,smr);}Sall_prod(){returnd[1];}voidapply(intp,Ff){assert(0<=p&&p<_n);p+=size;for(inti=log;i>=1;i--)push(p>>i);d[p]=mapping(f,d[p]);for(inti=1;i<=log;i++)update(p>>i);}voidapply(intl,intr,Ff){assert(0<=l&&l<=r&&r<=_n);if(l==r)return;l+=size;r+=size;for(inti=log;i>=1;i--){if(((l>>i)<<i)!=l)push(l>>i);if(((r>>i)<<i)!=r)push((r-1)>>i);}{intl2=l,r2=r;while(l<r){if(l&1)all_apply(l++,f);if(r&1)all_apply(--r,f);l>>=1;r>>=1;}l=l2;r=r2;}for(inti=1;i<=log;i++){if(((l>>i)<<i)!=l)update(l>>i);if(((r>>i)<<i)!=r)update((r-1)>>i);}}template<bool(*g)(S)>intmax_right(intl){returnmax_right(l,[](Sx){returng(x);});}template<classG>intmax_right(intl,Gg){assert(0<=l&&l<=_n);assert(g(e()));if(l==_n)return_n;l+=size;for(inti=log;i>=1;i--)push(l>>i);Ssm=e();do{while(l%2==0)l>>=1;if(!g(op(sm,d[l]))){while(l<size){push(l);l=(2*l);if(g(op(sm,d[l]))){sm=op(sm,d[l]);l++;}}returnl-size;}sm=op(sm,d[l]);l++;}while((l&-l)!=l);return_n;}template<bool(*g)(S)>intmin_left(intr){returnmin_left(r,[](Sx){returng(x);});}template<classG>intmin_left(intr,Gg){assert(0<=r&&r<=_n);assert(g(e()));if(r==0)return0;r+=size;for(inti=log;i>=1;i--)push((r-1)>>i);Ssm=e();do{r--;while(r>1&&(r%2))r>>=1;if(!g(op(d[r],sm))){while(r<size){push(r);r=(2*r+1);if(g(op(d[r],sm))){sm=op(d[r],sm);r--;}}returnr+1-size;}sm=op(d[r],sm);}while((r&-r)!=r);return0;}private:int_n,size,log;std::vector<S>d;std::vector<F>lz;voidupdate(intk){d[k]=op(d[2*k],d[2*k+1]);}voidall_apply(intk,Ff){d[k]=mapping(f,d[k]);if(k<size)lz[k]=composition(f,lz[k]);}voidpush(intk){all_apply(2*k,lz[k]);all_apply(2*k+1,lz[k]);lz[k]=id();}};}// namespace e6nlaq
#line 2 "include/e6nlaq/lazysegtree.hpp"
// This file is a fork of AtCoder Library.#define E6NLAQ_LAZYSEGTREE_HPP
#include<cassert>
#include<functional>
#include<vector>#line 2 "include/e6nlaq/internal/bit.hpp"
// This file is a fork of AtCoder Library.#define E6NLAQ_INTERNAL_BITOP_HPP
#ifdef _MSC_VER
#include<intrin.h>
#endif
#if __cplusplus >= 202002L
#include<bit>
#endif
namespacee6nlaq{namespaceinternal{#if __cplusplus >= 202002L
usingstd::bit_ceil;#else
// @return same with std::bit::bit_ceilunsignedintbit_ceil(unsignedintn){unsignedintx=1;while(x<(unsignedint)(n))x*=2;returnx;}#endif
// @param n `1 <= n`// @return same with std::bit::countr_zerointcountr_zero(unsignedintn){#ifdef _MSC_VER
unsignedlongindex;_BitScanForward(&index,n);returnindex;#else
return__builtin_ctz(n);#endif
}// @param n `1 <= n`// @return same with std::bit::countr_zeroconstexprintcountr_zero_constexpr(unsignedintn){intx=0;while(!(n&(1<<x)))x++;returnx;}}// namespace internal}// namespace e6nlaq#line 12 "include/e6nlaq/lazysegtree.hpp"
namespacee6nlaq{#if __cplusplus >= 201703L
template<classS,autoop,autoe,classF,automapping,autocomposition,autoid>structlazy_segtree{static_assert(std::is_convertible_v<decltype(op),std::function<S(S,S)>>,"op must work as S(S, S)");static_assert(std::is_convertible_v<decltype(e),std::function<S()>>,"e must work as S()");static_assert(std::is_convertible_v<decltype(mapping),std::function<S(F,S)>>,"mapping must work as F(F, S)");static_assert(std::is_convertible_v<decltype(composition),std::function<F(F,F)>>,"compostiion must work as F(F, F)");static_assert(std::is_convertible_v<decltype(id),std::function<F()>>,"id must work as F()");#else
template<classS,S(*op)(S,S),S(*e)(),classF,S(*mapping)(F,S),F(*composition)(F,F),F(*id)()>structlazy_segtree{#endif
public:lazy_segtree():lazy_segtree(0){}explicitlazy_segtree(intn):lazy_segtree(std::vector<S>(n,e())){}explicitlazy_segtree(conststd::vector<S>&v):_n(int(v.size())){size=(int)internal::bit_ceil((unsignedint)(_n));log=internal::countr_zero((unsignedint)size);d=std::vector<S>(2*size,e());lz=std::vector<F>(size,id());for(inti=0;i<_n;i++)d[size+i]=v[i];for(inti=size-1;i>=1;i--){update(i);}}voidset(intp,Sx){assert(0<=p&&p<_n);p+=size;for(inti=log;i>=1;i--)push(p>>i);d[p]=x;for(inti=1;i<=log;i++)update(p>>i);}Sget(intp){assert(0<=p&&p<_n);p+=size;for(inti=log;i>=1;i--)push(p>>i);returnd[p];}Sprod(intl,intr){assert(0<=l&&l<=r&&r<=_n);if(l==r)returne();l+=size;r+=size;for(inti=log;i>=1;i--){if(((l>>i)<<i)!=l)push(l>>i);if(((r>>i)<<i)!=r)push((r-1)>>i);}Ssml=e(),smr=e();while(l<r){if(l&1)sml=op(sml,d[l++]);if(r&1)smr=op(d[--r],smr);l>>=1;r>>=1;}returnop(sml,smr);}Sall_prod(){returnd[1];}voidapply(intp,Ff){assert(0<=p&&p<_n);p+=size;for(inti=log;i>=1;i--)push(p>>i);d[p]=mapping(f,d[p]);for(inti=1;i<=log;i++)update(p>>i);}voidapply(intl,intr,Ff){assert(0<=l&&l<=r&&r<=_n);if(l==r)return;l+=size;r+=size;for(inti=log;i>=1;i--){if(((l>>i)<<i)!=l)push(l>>i);if(((r>>i)<<i)!=r)push((r-1)>>i);}{intl2=l,r2=r;while(l<r){if(l&1)all_apply(l++,f);if(r&1)all_apply(--r,f);l>>=1;r>>=1;}l=l2;r=r2;}for(inti=1;i<=log;i++){if(((l>>i)<<i)!=l)update(l>>i);if(((r>>i)<<i)!=r)update((r-1)>>i);}}template<bool(*g)(S)>intmax_right(intl){returnmax_right(l,[](Sx){returng(x);});}template<classG>intmax_right(intl,Gg){assert(0<=l&&l<=_n);assert(g(e()));if(l==_n)return_n;l+=size;for(inti=log;i>=1;i--)push(l>>i);Ssm=e();do{while(l%2==0)l>>=1;if(!g(op(sm,d[l]))){while(l<size){push(l);l=(2*l);if(g(op(sm,d[l]))){sm=op(sm,d[l]);l++;}}returnl-size;}sm=op(sm,d[l]);l++;}while((l&-l)!=l);return_n;}template<bool(*g)(S)>intmin_left(intr){returnmin_left(r,[](Sx){returng(x);});}template<classG>intmin_left(intr,Gg){assert(0<=r&&r<=_n);assert(g(e()));if(r==0)return0;r+=size;for(inti=log;i>=1;i--)push((r-1)>>i);Ssm=e();do{r--;while(r>1&&(r%2))r>>=1;if(!g(op(d[r],sm))){while(r<size){push(r);r=(2*r+1);if(g(op(d[r],sm))){sm=op(d[r],sm);r--;}}returnr+1-size;}sm=op(d[r],sm);}while((r&-r)!=r);return0;}private:int_n,size,log;std::vector<S>d;std::vector<F>lz;voidupdate(intk){d[k]=op(d[2*k],d[2*k+1]);}voidall_apply(intk,Ff){d[k]=mapping(f,d[k]);if(k<size)lz[k]=composition(f,lz[k]);}voidpush(intk){all_apply(2*k,lz[k]);all_apply(2*k+1,lz[k]);lz[k]=id();}};}// namespace e6nlaq