#include #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") using namespace std; using std::cout; using std::cin; using std::endl; using ll=long long; using ld=long double; ll ILL=2167167167167167167; const int INF=2100000000; const int mod=998244353; #define rep(i,a,b) for (ll i=a;i using _pq = priority_queue, greater>; template ll LB(vector &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();} template ll UB(vector &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();} template bool chmin(T &a,const T &b){if(a>b){a=b;return 1;}else return 0;} template bool chmax(T &a,const T &b){if(a void So(vector &v) {sort(v.begin(),v.end());} template void Sore(vector &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});} void yneos(bool a){if(a) cout<<"Yes\n"; else cout<<"No\n";} template void vec_out(vector &p){for(int i=0;i<(int)(p.size());i++){if(i) cout<<" ";cout< T vec_min(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;} template T vec_max(vector &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;} template T vec_sum(vector &a){assert(!a.empty());T ans=a[0]-a[0];for(auto &x:a) ans+=x;return ans;} int pop_count(long long a){int res=0;while(a){res+=(a&1),a>>=1;}return res;} namespace po167{ //LCP vec[0,n) and vec[i,n) //for all i //O(vec.size()) template std::vector Z_algo(std::vector &vec){ int n=vec.size(); int ind=1,j=0,k; std::vector ans(n,0); ans[0]=n; while(ind Z_algo(std::string &vec){ int n=vec.size(); int ind=1,j=0,k; std::vector ans(n,0); ans[0]=n; while(ind>t; rep(i,0,t) solve(); } void solve(){ ll N,M; cin>>N>>M; vector A(N),B(M); vector C(M+1); rep(i,0,N) cin>>A[i]; rep(i,0,M) cin>>B[i]; rep(i,0,M) cin>>C[i]; auto p=A; p.push_back(-1); rep(i,0,M) p.push_back(B[i]); auto tmp=Z_algo(p); vector Z(M); rep(i,0,M) Z[i]=tmp[N+i+1]; vector> H(M+1); rep(i,0,M) H[i+Z[i]].push_back(i); vector dp(M+1,ILL); vector ok(M+1); vector order(M); rep(i,0,M) order[i]=i; sort(all(order),[&](int l,int r){ return C[l]>C[r]; }); dp[0]=0; ok[0]=1; int Q=1000; vector ch; rep(i,1,M+1){ if((i-1)%Q==0){ int L=i,R=min(i+Q,M+1); ch.clear(); vector lis; rep(j,0,M){ int a=order[j]; if(L<=a&&aC[a]) lis[ind]=a; } else lis.push_back(a); } else lis.push_back(a); } } } vector st; int k=-1; // (a/b)<=(c/d) ? auto f=[](ll a,ll b,ll c,ll d)->bool{ if(a/b!=c/d) return a/b