#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cmath>
#include <set>
#include <map>
#include <iterator>
using namespace std;
 
#define ll long long
 
 
#define F first
#define S second
 
#define en end()
#define bg begin()
 
#define rev reverse
#define mp make_pair
#define pb push_back
ll sum;
ll gcd(ll a, ll b) {
    if (a < b)
        return gcd(b, a);
 
    if (b == 0)
        return a;
 
    return gcd(b, a % b);
 
 
 
}
ll lcm(ll a, ll b)
{
    return (a / gcd(a, b)) * b;
}
bool koren(int n)
{
    int odd = 1;
    while (n > 0)
    {
        n = n - odd;
        odd = odd + 2;
    }
    return n == 0;
}
int pere(int n){
    sum = 0;
    while(n > 0){
        sum = sum * 10 + n % 10;
        n /= 10;
    }
    return sum;
}
double binpow(double x, ll y) {
    double g = 1;
    while (y) {
        if (y % 2) {
            g *= x;
        }
        x *= x;
        y /= 2;
    }
    return g;
}
ll d[500000], w[500000];
double dp[500000];
pair <long long, long long> dw[500000];
int main()
{
    int n, m;
    cin >> n >> m;
    double r;
    cin >> r;
    for (int i = 1; i <= n; i++){
        cin >> dw[i].F >> dw[i].S;
    }
    sort(dw + 1, dw + n + 1);
    for (int i = 1; i <= n; i++)
        d[i] = dw[i].F;
        
    for (int i = 1; i <= n; i++){
        dp[i] = dp[i - 1] * binpow(1.0 - r, dw[i].F - dw[i - 1].F) + dw[i].S * r;
        
    }
    cout  << fixed << setprecision(7);
    for (int i = 1; i <= m; i++){
        int q;
        cin >> q;
        int pos = int(upper_bound(d, d + n + 1, q) - d) - 1;
        double ans = dp[pos] * binpow(1.0 - r, q - d[pos]);
        
        cout << ans << ' ';
    }
    
}
