#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define sz(x) (x).size()
#define F first
#define S second
#define left(v) (v) + (v)
#define right(v) (v) + (v) + 1
#define ll long long
#define int long long
using namespace std;
///using ll = long long;
//using ull = unsigned long long;
const int MAXN = 1e5 + 5;

int n, m;
double r;
double dp[MAXN];
double binpow(double a, int b) {
 if(!b) return 1;
 else if(b == 1) return a;
 else if(b % 2 == 0) {
  double cur = binpow(a, b / 2);
  return cur * cur;
 }
 else {
  return binpow(a, b - 1) * a;
 }
}
void query() {
    cin >> n >> m >> r;
    double r2 = (double)1 - r;
    vector<pair<int, int> > v;
    for (int i = 1; i <= n; ++i) {
     int x, y;
     cin >> x >> y;
     v.pb(mp(x, y));
 }
 sort(all(v));
 dp[0] = v[0].S * r;
 for (int i = 1; i < n; ++i) {
  int dist = v[i].F - v[i - 1].F;
  dp[i] = dp[i - 1] * binpow(r2, dist);
  dp[i] = dp[i] + v[i].S * r;
 }
 for (int i = 1; i <= m; ++i) {
  int x;
  cin >> x;
  int l = -1, r = sz(v);
  while (l + 1 < r) {
   int mid = (l + r) >> 1;
   if(v[mid].F <= x) l = mid;
   else r = mid;
  }
  if(l == -1) cout << "0\n";
  else {
   //cout << l << ' ' << dp[l] << '\n';
   double cur = dp[l];
   int dist = x - v[l].F;
   cur = cur * binpow(r2, dist);
   cout.precision(6);
   cout << fixed << cur << '\n';
  }
 }
}
signed main() {
 int tt = 1, ct = 0;
    //cin >> tt;
    while (tt--) {
        //cout << "Case " << ++ct << ": ";
  query();
 }
 return 0;
}
