#include<bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr ll INF=1e18;
constexpr ll MAXN=500005;
ll n,m,d;
vector<ll> v;
ll tree_mn[4*MAXN];
ll tree_mx[4*MAXN];
ll tree_cnt[4*MAXN];
ll tree_res[4*MAXN];
bool compare(ll i,ll j){
if(v[i]!=v[j])return v[i]<v[j];
return i<j;
}
void merge(ll i,ll left,ll right){
tree_cnt[i]=tree_cnt[left]+tree_cnt[right];
tree_mn[i]=min(tree_mn[left],tree_mn[right]+tree_cnt[left]*d);
tree_mx[i]=max(tree_mx[left],tree_mx[right]+tree_cnt[left]*d);
ll cross_res=(tree_mx[right]+tree_cnt[left]*d)-tree_mn[left];
tree_res[i]=max({tree_res[left],tree_res[right],cross_res});
return ;
}
void update(ll i,ll l,ll r,ll key,ll val){
if(l==r){
tree_mn[i]=d-val;
tree_mx[i]=d-val;
tree_cnt[i]=1;
tree_res[i]=0;
return;
}
ll mid=l+(r-l)/2;
if(key<=mid)update(i*2,l,mid,key,val);
else update(i*2+1,mid+1,r,key,val);
merge(i,i*2,i*2+1);
return ;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m>>d;
ll total=n+m;
v.resize(total+1);
vector<ll> order(total+1);
for(ll i=1;i<=total;++i){
cin>>v[i];
order[i]=i;
}
sort(order.begin()+1,order.end(),compare);
vector<ll> pos(total+1);
for(ll i=1;i<=total;++i){
pos[order[i]]=i;
}
for(ll i=0;i<4*MAXN;++i){
tree_mn[i]=INF;
tree_mx[i]=-INF;
tree_cnt[i]=0;
tree_res[i]=0;
}
for(ll i=1;i<=total;++i){
update(1,1,total,pos[i],v[i]);
if(i>n){
ll res=tree_res[1];
cout<<res/2;
if(res%2!=0)cout<<".5";
cout<<" ";
}
}
return 0;
}