#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q,k,a[1003][1003],st[4003],x[100005],ans[2000006];
set <int> se;
map <int,int> mp;
vector <pair<int,int>> ve[2000006];
void UPDATE(int id, int l, int r, int i, int v)
{
if (l>i || r<i) return;
else if (l==r)
{
st[id]=v;
return;
}
int mid=(l+r)/2;
if (i<=mid) UPDATE(id*2,l,mid,i,v);
else UPDATE(id*2+1,mid+1,r,i,v);
st[id]=max(st[id*2],st[id*2+1]);
}
int GET(int id, int l, int r, int u, int v)
{
if (l>v || r<u) return -1e18;
else if (l>=u && r<=v) return st[id];
int mid=(l+r)/2;
return max(GET(id*2,l,mid,u,v),GET(id*2+1,mid+1,r,u,v));
}
void NEN()
{
int j=0;
for (int i=1;i<=q;i++) se.insert(x[i]%k);
for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) se.insert(a[i][j]%k);
for (int v : se) j++,mp[v]=j;
for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) ve[mp[a[i][j]%k]].push_back({i,j});
}
void SOLVE()
{
for (int i=1;i<=2000000;i++) if (ve[i].size())
{
int res=0;
for (int j=1;j<=m;j++) UPDATE(1,1,m,j,0);
for (pair <int,int> p : ve[i])
{
int y=p.second,mx=GET(1,1,m,1,y)+1;
if (GET(1,1,m,y,y)<mx) UPDATE(1,1,m,y,mx),res=max(res,mx);
}
ans[i]=res;
}
}
signed main()
{
ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m>>q>>k;
for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) cin>>a[i][j];
for (int i=1;i<=q;i++) cin>>x[i];
NEN(),SOLVE();
for (int i=1;i<=q;i++) cout<<ans[mp[x[i]%k]]<<'\n';
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbixtLHEsayxhWzEwMDNdWzEwMDNdLHN0WzQwMDNdLHhbMTAwMDA1XSxhbnNbMjAwMDAwNl07CnNldCA8aW50PiBzZTsKbWFwIDxpbnQsaW50PiBtcDsKdmVjdG9yIDxwYWlyPGludCxpbnQ+PiB2ZVsyMDAwMDA2XTsKdm9pZCBVUERBVEUoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBpLCBpbnQgdikKewogICAgaWYgKGw+aSB8fCByPGkpIHJldHVybjsKICAgIGVsc2UgaWYgKGw9PXIpCiAgICB7CiAgICAgICAgc3RbaWRdPXY7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZD0obCtyKS8yOwogICAgaWYgKGk8PW1pZCkgVVBEQVRFKGlkKjIsbCxtaWQsaSx2KTsKICAgIGVsc2UgVVBEQVRFKGlkKjIrMSxtaWQrMSxyLGksdik7CiAgICBzdFtpZF09bWF4KHN0W2lkKjJdLHN0W2lkKjIrMV0pOwp9CmludCBHRVQoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikKewogICAgaWYgKGw+diB8fCByPHUpIHJldHVybiAtMWUxODsKICAgIGVsc2UgaWYgKGw+PXUgJiYgcjw9dikgcmV0dXJuIHN0W2lkXTsKICAgIGludCBtaWQ9KGwrcikvMjsKICAgIHJldHVybiBtYXgoR0VUKGlkKjIsbCxtaWQsdSx2KSxHRVQoaWQqMisxLG1pZCsxLHIsdSx2KSk7Cn0Kdm9pZCBORU4oKQp7CiAgICBpbnQgaj0wOwogICAgZm9yIChpbnQgaT0xO2k8PXE7aSsrKSBzZS5pbnNlcnQoeFtpXSVrKTsKICAgIGZvciAoaW50IGk9MTtpPD1uO2krKykgZm9yIChpbnQgaj0xO2o8PW07aisrKSBzZS5pbnNlcnQoYVtpXVtqXSVrKTsKICAgIGZvciAoaW50IHYgOiBzZSkgaisrLG1wW3ZdPWo7CiAgICBmb3IgKGludCBpPTE7aTw9bjtpKyspIGZvciAoaW50IGo9MTtqPD1tO2orKykgdmVbbXBbYVtpXVtqXSVrXV0ucHVzaF9iYWNrKHtpLGp9KTsKfQp2b2lkIFNPTFZFKCkKewogICAgZm9yIChpbnQgaT0xO2k8PTIwMDAwMDA7aSsrKSBpZiAodmVbaV0uc2l6ZSgpKQogICAgewogICAgICAgIGludCByZXM9MDsKICAgICAgICBmb3IgKGludCBqPTE7ajw9bTtqKyspIFVQREFURSgxLDEsbSxqLDApOwogICAgICAgIGZvciAocGFpciA8aW50LGludD4gcCA6IHZlW2ldKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHk9cC5zZWNvbmQsbXg9R0VUKDEsMSxtLDEseSkrMTsKICAgICAgICAgICAgaWYgKEdFVCgxLDEsbSx5LHkpPG14KSBVUERBVEUoMSwxLG0seSxteCkscmVzPW1heChyZXMsbXgpOwogICAgICAgIH0KICAgICAgICBhbnNbaV09cmVzOwogICAgfQp9CnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksY2luLnRpZSgwKSxjb3V0LnRpZSgwKTsKICAgIGNpbj4+bj4+bT4+cT4+azsKICAgIGZvciAoaW50IGk9MTtpPD1uO2krKykgZm9yIChpbnQgaj0xO2o8PW07aisrKSBjaW4+PmFbaV1bal07CiAgICBmb3IgKGludCBpPTE7aTw9cTtpKyspIGNpbj4+eFtpXTsKICAgIE5FTigpLFNPTFZFKCk7CiAgICBmb3IgKGludCBpPTE7aTw9cTtpKyspIGNvdXQ8PGFuc1ttcFt4W2ldJWtdXTw8J1xuJzsKICAgIHJldHVybiAwOwp9