1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
   | #include <bits/stdc++.h> using namespace std;
 
 
 
  #ifdef Fread char buf[1 << 21], *iS, *iT; #define gc() (iS == iT ? (iT = (iS = buf) + fread (buf, 1, 1 << 21, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++) #define getchar gc #endif 
  template <typename T> void r1(T &x) { 	x = 0; 	char c(getchar()); 	int f(1); 	for(; c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1; 	for(; '0' <= c && c <= '9';c = getchar()) x = (x * 10) + (c ^ 48); 	x *= f; }
  template <typename T,typename... Args> inline void r1(T& t, Args&... args) {     r1(t);  r1(args...); }
  #ifdef Getmod const int mod  = 1e9 + 7; template <int mod> struct typemod {     int z;     typemod(int a = 0) : z(a) {}     inline int inc(int a,int b) const {return a += b - mod, a + ((a >> 31) & mod);}     inline int dec(int a,int b) const {return a -= b, a + ((a >> 31) & mod);}     inline int mul(int a,int b) const {return 1ll * a * b % mod;}     typemod<mod> operator + (const typemod<mod> &x) const {return typemod(inc(z, x.z));}     typemod<mod> operator - (const typemod<mod> &x) const {return typemod(dec(z, x.z));}     typemod<mod> operator * (const typemod<mod> &x) const {return typemod(mul(z, x.z));}     typemod<mod>& operator += (const typemod<mod> &x) {*this = *this + x; return *this;}     typemod<mod>& operator -= (const typemod<mod> &x) {*this = *this - x; return *this;}     typemod<mod>& operator *= (const typemod<mod> &x) {*this = *this * x; return *this;}     int operator == (const typemod<mod> &x) const {return x.z == z;}     int operator != (const typemod<mod> &x) const {return x.z != z;} }; typedef typemod<mod> Tm; #endif
  #define int long long const int maxn = 2e5 + 5; const int maxm = maxn << 1;
  int n, m, K, X, Y, flag; int a[maxn], b[maxn];
  int f(int l,int r) {     int ln = r - l - 1;     if(ln < 0) return 0;     int res = (ln % K) * Y + (ln / K) * min(X, Y * K);     if(*max_element(a + l + 1, a + r) > max(a[l], a[r])) {         if(ln / K == 0) flag = 1;         res = res + X - min(Y * K, X);     }     return res; }
  signed main() {
 
      int i, j, k;     r1(n, m, X, K, Y);     for(i = 1; i <= n; ++ i) r1(a[i]);     for(i = 1; i <= m; ++ i) r1(b[i]);     int res(0);     for(i = 1, k = 1, j = 0; i <= m + 1; j = k, ++ i) {         for(; !flag && a[k] != b[i]; ++ k)             flag = (k > n) && (b[i]);         res += f(j, k);     }     printf("%lld\n", flag ? -1 : res); 	return 0; }
 
   |