#include<bits/stdc++.h>
using namespace std;
long long d,sm = LLONG_MAX;
set<long long> idk;
struct node {
int nl = -1;
int nr = -1;
long long ans = 0;
long long pr = 0;
long long su = 0;
long long sb = 0;
int br = 0;
int pos = 0;
};
vector<node> seg(1);
node combine(node a, node b) {
node c;
c.nl = a.pos;
c.nr = b.pos;
c.pr = max(a.pr,a.sb+b.pr);
c.su = max(b.su,b.sb+a.su);
c.sb = a.sb+b.sb;
c.ans = max(a.su+b.pr,max(a.ans,b.ans));
return c;
}
void upd(long long l, long long r, long long x, long long p, long long c) {
if(l == r) {
if(c == 0) {
seg[x].br++;
seg[x].sb+=d;
}
else {
seg[x].sb = seg[x].br*d+d-c;
}
long long b = seg[x].br;
seg[x].pr = max(b*d,seg[x].sb);
seg[x].su = max(0LL,seg[x].sb);
seg[x].ans = seg[x].pr;
return;
}
long long mid = (l+r)/2;
if(p <= mid) {
if(seg[x].nl == -1) {
node y;
y.pos = seg.size();
seg[x].nl = seg.size();
seg.push_back(y);
}
upd(l,mid,seg[x].nl,p,c);
}
else {
if(seg[x].nr == -1) {
node y;
y.pos = seg.size();
seg[x].nr = seg.size();
seg.push_back(y);
}
upd(mid+1,r,seg[x].nr,p,c);
}
if(seg[x].nl == -1) {
seg[x].ans = seg[seg[x].nr].ans;
seg[x].sb = seg[seg[x].nr].sb;
seg[x].pr = seg[seg[x].nr].pr;
seg[x].su = seg[seg[x].nr].su;
}
else if(seg[x].nr == -1) {
seg[x].ans = seg[seg[x].nl].ans;
seg[x].sb = seg[seg[x].nl].sb;
seg[x].pr = seg[seg[x].nl].pr;
seg[x].su = seg[seg[x].nl].su;
}
else {
seg[x] = combine(seg[seg[x].nl],seg[seg[x].nr]);
}
seg[x].pos = x;
}
void ins(long long a) {
auto y = idk.lower_bound(a);
if(y != idk.end()) {
upd(0,1e9,0,a,(*y)-a);
}
if(a < sm) {
sm = a;
}
else {
auto y = *(--idk.upper_bound(a));
if(y < a) {
upd(0,1e9,0,y,a-y);
}
}
idk.insert(a);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
long long n,m,a;
cin >> n >> m >> d;
for(long long i = 0; i < n; i++) {
cin >> a;
ins(a);
}
for(long long i = 0; i < m; i++) {
cin >> a;
ins(a);
cout << seg[0].ans/2;
if(seg[0].ans%2) {
cout << ".5";
}
cout << " ";
}
cout << endl;
return 0;
}