/* クエリ平方分割でO(N\sqrt(N)) その割には遅い(割り算しているから?) 参考 https://kazuma8128.hatenablog.com/entry/2018/03/14/215007 */ #include #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") using namespace std; using ll=long long; ll ILL=2167167167167167167; #define rep(i,a,b) for (ll i=a;i bool chmin(T &a,const T &b){if(a>b){a=b;return 1;}else return 0;} template void So(vector &v) {sort(v.begin(),v.end());} 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; if(A[0]==B[0]) ok[0]=1; int Q=500; vector ch; rep(i,1,M+1){ if((i-1)%Q==0){ ll 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]*L+dp[a]) lis[ind]=a; else if(C[lis[ind]]*R+dp[lis[ind]]>C[a]*R+dp[a])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{ ll x1=a/b,x2=c/d; if(x1!=x2) return x1