import std; void main () { int N, M; readln.read(N, M); int[] A = readln.split.to!(int[]); int[] B = readln.split.to!(int[]); int[] C = readln.split.to!(int[]); solve(N, M, A, B, C); } void solve (int N, int M, int[] A, int[] B, int[] C) { /* すでに関係が出来上がっている列はそのままor一挙変更であることがわかる。 つなぎ目をいい感じに選ぶ問題に帰着する -> 連想配列でいい感じに */ // 分割 int[] sp; sp ~= 0; foreach (i; 0..N-1) { if (A[i+1]-A[i] == B[i%M]) { continue; } sp ~= i+1; } sp ~= N; bool[int] spmp; foreach (s; sp) spmp[s] = true; long[] cum = new long[](N+1); // cum[i] := [0, i) cum[0] = 0; foreach (i; 1..N+1) { cum[i] = cum[i-1] + C[i-1]; } long[int] cost; foreach (i; 0..sp.length-1) { cost[sp[i]] = cum[sp[i+1]] - cum[sp[i]]; } // 初項が0であったときの美しい数列をトレス long[long] mp; long b = 0; foreach (i; 0..N) { if (i in spmp) { mp[A[i]-b] += cost[i]; } b += B[i%M]; } long ans = cum[N]; long sub = -long.max; foreach (key, val; mp) { sub = max(sub, val); } writeln(ans - sub); } void read (T...) (string S, ref T args) { auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }