最后一个 hack 过不了
// Problem: P2538 [SCOI2008] 城堡
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2538
// Memory Limit: 128 MB
// Time Limit: 800000 ms
// Date: 2024/10/24 20:56:00
// Author: Li_Feiy
#include <bits/stdc++.h>
#define arrout(a, n) rep(i, 1, n) printk(a[i])
#define arrin(a, n) rep(i, 1, n) a[i] = read()
#define rep(i, x, n) for(int i = x; i <= n; i++)
#define dep(i, x, n) for(int i = x; i >= n; i--)
#define erg(i, x) for(int i = head[x]; i; i = e[i].nex)
#define dbg(x) std::cout << #x << ":" << x << " "
#define mem(a, x) memset(a, x, sizeof a)
#define all(x) x.begin(), x.end()
#define arrall(a, n) a + 1, a + 1 + n
#define PII std::pair<int, int>
#define m_p std::make_pair
#define u_b upper_bound
#define l_b lower_bound
#define p_b push_back
#define CD const double
#define CI const int
#define int long long
#define il inline
#define ss second
#define ff first
#define itn int
int read() {
char ch = getchar();
int r = 0, w = 1;
while(ch < '0' || ch > '9') w = ch == '-' ? -1 : w, ch = getchar();
while(ch >= '0' && ch <= '9') r = (r << 3) + (r << 1) + (ch ^ 48), ch = getchar();
return r * w;
}
void print(int x) {
if(x < 0) putchar('-'), x = -x;
if(x >= 10) print(x / 10);
putchar(x % 10 + '0');
} template<typename ...Args>
void print(int t, Args... args) { print(t), print(args...); }
void printl(int x) { print(x), putchar('\n'); }
template<typename ...Args>
void printl(int t, Args... args) { printl(t), printl(args...); }
void printk(int x) { print(x), putchar(' '); }
template<typename ...Args>
void printk(int t, Args ... args) { printk(t), printk(args...); }
CI N = 55;
int n, m, k, tot, ans, c[N], mk[N], id[N], mi[N], vis[N], dis[N][N], head[N];
struct edge {
int to, nex, data;
} e[N << 1];
struct node {
int to, dis;
bool operator<(const node& b) const { return dis > b.dis; }
};
void add(int x, int y, int z) {
e[++tot].to = y;
e[tot].data = z;
e[tot].nex = head[x];
head[x] = tot;
}
void dijkstra(int st, int id) {
std::priority_queue<node> q;
mem(dis[id], 0x3f);
q.push((node){st, 0});
dis[id][st] = 0;
while(!q.empty()) {
auto u = q.top();
q.pop();
int x = u.to;
if(dis[id][x] != u.dis) continue;
erg(i, x) {
int y = e[i].to, z = e[i].data;
if(dis[id][y] > dis[id][x] + z) dis[id][y] = dis[id][x] + z, q.push((node){y, dis[id][y]});
}
}
}
int calc() {
int val = 0;
mem(mi, 0x3f);
rep(i, 1, k) vis[id[i]] = 1;
rep(i, 1, n) if(vis[i]) rep(j, 1, n) if(!vis[j]) mi[j] = std::min(mi[j], dis[i][j]);
rep(i, 1, n) if(!vis[i]) val = std::max(val, mi[i]);
rep(i, 1, k) vis[id[i]] = 0;
return val;
}
void SA() {
double t = 1000, tk = 1e-6, d = 0.997;
while(t > tk) {
while((double)clock() / CLOCKS_PER_SEC > 0.795) print(ans), exit(0);
int x = rand() % id[0] + 1, y = rand() % id[0] + 1;
std::swap(id[x], id[y]);
int now = calc(), delta = now - ans;
if(delta < 0) ans = now;
else if(exp(-delta / t) * RAND_MAX < rand()) std::swap(id[x], id[y]);
t *= d;
}
}
signed main() {
srand(19260817);
srand(rand());
srand(rand());
n = read(), m = read(), k = read();
arrin(mk, n);
rep(i, 1, n) {
int z = read();
add(i, mk[i] + 1, z), add(mk[i] + 1, i, z);
}
rep(i, 1, n) dijkstra(i, i);
rep(i, 1, m) vis[read() + 1] = 1;
rep(i, 1, n) if(!vis[i]) id[++id[0]] = i;
rep(i, 1, k) vis[id[i]] = 1;
ans = calc();
rep(i, 1, k) vis[id[i]] = 0;
while(1) SA();
print(ans);
return 0;
}