#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; // Self Template Code BGEIN #define sz(x) ((int)((x).size())) #define out(x) printf(#x" %d\n", x) #define rep(i,n) for (int i = 0; i < (n); ++i) #define repf(i,a,b) for (int i = (a); i <= (b); ++i) #define repd(i,a,b) for (int i = (a); i >= (b); --i) #define repcase int t, Case = 1; for (scanf ("%d", &t); t; --t) #define repeach(i,x) for (__typeof((x).begin()) i = (x).begin(); i != (x).end(); ++i) typedef long long int64; typedef pair pii; int sgn(double x) { return (x > 1e-8) - (x < -1e-8); } int count_bit(int x) { return x == 0? 0 : count_bit(x >> 1) + (x & 1); } template inline void ckmin(T &a, const T b) { if (b < a) a = b; } template inline void ckmax(T &a, const T b) { if (b > a) a = b; } // Self Template Code END struct point { int x, id; double v; bool operator < (const point& rhs) const { return x < rhs.x; } }; const int MAXN = 100000 + 10; point p[MAXN]; int n, m, k; int cid[MAXN]; int main() { repcase { scanf ("%d%d%d", &n, &m, &k); rep (i, n) { scanf ("%d%lf", &p[i].x, &p[i].v); p[i].id = i; } sort (p, p + n); rep (i, n) { cid[p[i].id] = i; } double res = 0; rep (i, m) { int idx; scanf ("%d", &idx); idx = cid[idx - 1]; double ret = 0; int l = idx - 1, r = idx + 1; rep (j, k) { if (l < 0) ret += p[r++].v; else if (r >= n) ret += p[l--].v; else { int d1 = p[idx].x - p[l].x; int d2 = p[r].x - p[idx].x; if (d1 < d2 || (d1 == d2 && p[l].id < p[r].id)) { ret += p[l--].v; } else { ret += p[r++].v; } } } ret /= k; res += ret; p[idx].v = ret; } printf ("%lf\n", res); } return 0; }