#include <bits/stdc++.h>
using namespace std;
const int N = 2000 + 10,
			L = 100'000 + 10;
int n, m, q, l;
vector<pair<int, int>> ad[N];
int x[L];
const long long MAX = 1'000'000'000'000'000;
long long dist[N][N];
void sktra(int st) {
    for (int i = 1; i <= n; ++i) { 
        if (i == st) continue;
        fill(dist[i], dist[i] + n + 1, MAX);
    }
    using TP = tuple<long long, int, int>;
    priority_queue<TP, vector<TP>> pq;
    for (const auto& [v, w] : ad[st]) pq.emplace(dist[st][v], st, v);
    while (pq.size()) { 
        auto [d, u, p] = pq.top(); pq.pop();
        if (d != dist[u][p]) continue;
        for (const auto& [v, w] : ad[u]) { 
            if (v != p && dist[v][u] > d + w) { 
                pq.push({dist[v][u] = d + w, v, u});
            }
        }
    }
}
int32_t main() { 
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m >> q >> l;
    for (int i = 1; i <= m; ++i) {
        int u, v, w; cin >> u >> v >> w;
        ad[u].push_back({v, w});
        ad[v].push_back({u, w});
    }
    for (int i = 1; i <= l; ++i) cin >> x[i];
    for (int i = 1; i <= n; ++i) { 
        ad[i].push_back({0, 0});
        fill(dist[i], dist[i] + n + 1, MAX);
    }
    while (q--) { 
        int p, nX; cin >> p >> nX;
        x[p] = nX;
        
        { // reset
            for (int i = 1; i <= n; ++i) { 
                for (const auto& [v, w] : ad[i]) dist[i][v] = MAX;
            }
        }
        { // cal
            dist[x[1]][0] = 0;
            for (int i = 1; i < l; ++i) sktra(x[i]);
        }
        long long answer = *min_element(dist[x[l]], dist[x[l]] + n + 1);
        cout << (answer == MAX ? -1ll : answer) << "\n";
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |