#pragma once
structRollingHash{usingu128=__uint128_t;usingu64=uint64_t;staticconstu64MOD=(1ll<<61)-1;staticu64base;staticu64add(u64x,u64y){if((x+=y)>=MOD)x-=MOD;returnx;}staticu64sub(u64x,u64y){if((x-=y)>=MOD)x+=MOD;returnx;}staticu64mul(u64x,u64y){return(u64)((u128)x*y%MOD);}vector<u64>hash,pw;RollingHash():hash({0}),pw({1}){}template<classT>RollingHash(vector<T>&a):hash({0}),pw({1}){for(autov:a)push(v);}template<classT>voidpush(Tv){hash.push_back(add(mul(base,hash.back()),v));pw.push_back(mul(base,pw.back()));}u64get(intl,intr){assert(l<=r);returnsub(hash[r],mul(hash[l],pw[r-l]));}};RollingHash::u64RollingHash::base=[](){random_deviceseed_gen;mt19937rnd(seed_gen());returnrnd()%(1ull<<40);}();