#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
struct Seg{
int n,d;
vector<int>tree,mx,mn,sum,a,b;
void init(int N,int D){
n=N;
d=D;
tree.resize(n<<2,0);
mx.resize(n<<2,0);
mn.resize(n<<2,0);
sum.resize(n<<2,0);
a.resize(n<<2,0);
b.resize(n<<2,0);
}
int l,r;
void up(int node=1,int left=0,int right=-1){
if(right==-1)right=n-1;
if(left==right){
a[node]=b[node]=r;
return;
}
if(l>mid)up(node*2+1,mid+1,right);
else up(node*2,left,mid);
a[node]=a[node*2];
if(a[node]==0)a[node]=a[node*2+1];
b[node]=b[node*2+1];
if(b[node]==0)b[node]=b[node*2];
sum[node]=sum[node*2]+sum[node*2+1];
int ek=0;
if(b[node*2]!=0&&a[node*2+1]!=0){
ek=d-(a[node*2+1]-b[node*2]);
sum[node]+=ek;
}
mn[node]=min(mn[node*2],sum[node*2]+ek+mn[node*2+1]);
mx[node]=max(mx[node*2],sum[node*2]+ek+mx[node*2+1]);
tree[node]=max(tree[node*2],sum[node*2]+ek+mx[node*2+1]-min(sum[node*2]+ek,mn[node*2]));
}
void update(int tar,int x){
l=tar;r=x;
up();
}
};
int n,m,d;
int arr[200023],brr[200023];
map<int,int>mp;
int t=0;
Seg seg;
signed main(){
ios_base::sync_with_stdio(23^23);cin.tie(0);
cin>>n>>m>>d;
for(int i=1;i<=n;i++){
cin>>arr[i];
mp[arr[i]]++;
}
for(int i=1;i<=m;i++){
cin>>brr[i];
mp[brr[i]]++;
}
for(auto&[a,b]:mp){
t+=b;
b=t-b;
}
seg.init(t,d);
for(int i=1;i<=n;i++){
seg.update(mp[arr[i]]++,arr[i]);
}
for(int i=1;i<=m;i++){
seg.update(mp[brr[i]]++,brr[i]);
cout<<(seg.mx[1]/2.0)<<" ";
}
}