rt
#include <bits/stdc++.h>
using namespace std;
#define int long long
int b[55][55];
int op[55][55];
int v[55][55];
int bj[55][55];
int n,m,k,q;
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int sum1,sum2,sum3,sum4,sum5;
int sz1,sz2,sz3;
int tong[105];
int mainclr[105][2];
int z[105];
struct tng{
int x,id;
}tmp[105];
int main1=-1,main2=-1;
bool cmp(tng a,tng b){
return a.x>b.x;
}
bool cmpid(tng a,tng b){
return a.id<b.id;
}
void spj(int x,int y){
if(x<1||y<1||x>n||y>m){
return;
}
if(op[x][y]<0){
return;
}
sz1+=b[x][y]*sz2;
if(op[x][y]==0){
b[x][y]=op[x][y]=-1;
return;
}
if(op[x][y]==1){
b[x][y]=op[x][y]=-1;
for(int i=1;i<=m;i++){
spj(x,i);
}
}
else if(op[x][y]==2){
b[x][y]=op[x][y]=-1;
for(int i=1;i<=n;i++){
spj(i,y);
}
}
else if(op[x][y]==3){
b[x][y]=op[x][y]=-1;
for(int i=1;i<=n;i++){
spj(i,y);
}
for(int i=1;i<=m;i++){
spj(x,i);
}
}
else if(op[x][y]==4){
b[x][y]=op[x][y]=-1;
for(int i=x-1;i<=x+1;i++){
for(int j=y-1;j<=y+1;j++){
spj(i,j);
}
}
}
else if(op[x][y]==5){
b[x][y]=op[x][y]=-1;
for(int i=x-2;i<=x+2;i++){
for(int j=y-2;j<=y+2;j++){
spj(i,j);
}
}
}
else if(op[x][y]==6){
op[x][y]=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(b[x][y]!=b[i][j]||(x==i&&y==j)){
continue;
}
spj(i,j);
}
}
b[x][y]=-1;
}
}
int f;
void dfs(int x,int y){
// cout<<"dfs:"<<x<<"-"<<y<<"\n";
sz3+=1;
tong[b[x][y]]++;
bj[x][y]=1;
for(int i=0;i<4;i++){
int x2=x+dx[i];
int y2=y+dy[i];
if(x==5&&y==4){
// cout<<bj[6][4]<<"\n";
}
if(x2>=1&&y2>=1&&x2<=n&&y2<=m&&v[x2][y2]==1&&bj[x2][y2]==0&&b[x][y]==b[x2][y2]){
dfs(x2,y2);
}
}
}
bool boom(){
int ishave=0;
f=(sz2==1);
//行
for(int i=1;i<=n;i++){
for(int j=3;j<=m;j++){
if(op[i][j]==-1){
continue;
}
if(b[i][j]==b[i][j-1]&&b[i][j]==b[i][j-2]){
v[i][j]=1;
v[i][j-1]=1;
v[i][j-2]=1;
ishave=1;
}
}
}
//列
for(int i=3;i<=n;i++){
for(int j=1;j<=m;j++){
if(op[i][j]==-1){
continue;
}
if(b[i][j]==b[i-1][j]&&b[i][j]==b[i-2][j]){
v[i][j]=1;
v[i-1][j]=1;
v[i-2][j]=1;
ishave=1;
}
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<v[i][j]<<" ";
// }
// cout<<"\n";
// }
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(v[i][j]==1){
if(bj[i][j]==0){
dfs(i,j);
// cout<<i<<"-"<<j<<"\n";
// cout<<sz3<<"\n";
sum3+=50*(sz3-3)*(sz3-3);
sz3=0;
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(v[i][j]==1){
v[i][j]=0;
spj(i,j);
}
}
}
int mx=0;
for(int i=1;i<=100;i++){
mx=max(tong[i]*f,mx);
}
for(int i=1;i<=100;i++){
if(tong[i]==mx&&mx!=0){
if(main1==-1){
main1=i;
}
else{
main2=i;
}
}
}
memset(bj,0,sizeof(bj));
memset(tong,0,sizeof(tong));
return ishave;
}
void G(){
for(int j=1;j<=m;j++){
queue<int> q;
queue<int> opq;
for(int i=n;i>=1;i--){
if(b[i][j]!=-1){
q.push(b[i][j]);
opq.push(op[i][j]);
b[i][j]=op[i][j]=-1;
}
}
for(int i=n;q.size();i--){
b[i][j]=q.front();
op[i][j]=opq.front();
q.pop();
opq.pop();
}
}
}
void printb(){
cout<<"========printb=========\n";
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<b[i][j]<<" ";
}
cout<<"\n";
}
}
void slvsum4(){
int mx=0;
for(int a1=0;a1<=1;a1++){
for(int a2=0;a2<=1;a2++){
for(int a3=0;a3<=1;a3++){
for(int a4=0;a4<=1;a4++){
for(int a5=0;a5<=1;a5++){
z[1]=mainclr[0][a1];
z[2]=mainclr[1][a2];
z[3]=mainclr[2][a3];
z[4]=mainclr[3][a4];
z[5]=mainclr[4][a5];
if(z[1]==-1||z[2]==-1||z[3]==-1||z[4]==-1||z[5]==-1){
continue;
}
sort(z+1,z+6);
tmp[z[1]].x++;
tmp[z[2]].x++;
tmp[z[3]].x++;
tmp[z[4]].x++;
tmp[z[5]].x++;
sort(tmp+1,tmp+101,cmp);
if(z[1]==z[2]&&z[2]==z[3]&&z[3]==z[4]&&z[4]==z[5]){
mx=max(1000+z[1]*10,mx);
}
else if(tmp[1].x==4){
mx=max(mx,750+tmp[1].id*5);
}
else if(tmp[1].x==3&&tmp[2].x==2){
mx=max(mx,500+tmp[1].id*3+tmp[2].id);
}
else if(tmp[1].x==3){
mx=max(mx,300+tmp[1].id*3+tmp[2].id);
}
else if(tmp[1].x==2&&tmp[2].x==2){
mx=max(mx,200+max(tmp[1].id,tmp[2].id)+tmp[1].id+tmp[2].id);
}
else if(tmp[1].x==2){
mx=max(mx,100+tmp[1].id*2);
}
else{
mx=max(mx,50+max(z[1],max(z[2],max(z[3],max(z[4],z[5])))));
}
tmp[1].x=0;
tmp[2].x=0;
tmp[3].x=0;
tmp[4].x=0;
tmp[5].x=0;
sort(tmp+1,tmp+101,cmpid);
// cout<<z[1]<<" "<<z[2]<<" "<<z[3]<<" "<<z[4]<<" "<<z[5]<<"-"<<mx<<"\n";
}
}
}
}
}
sum4+=mx;
}
signed main() {
memset(b,0xff,sizeof(b));
memset(op,0xff,sizeof(op));
for(int i=1;i<=100;i++){
tmp[i].id=i;
}
cin>>n>>m>>k>>q;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>b[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>op[i][j];
}
}
int r=1;
int cnt=0;
for(int i=1;i<=q;i++){
G();
main1=-1,main2=-1;
int x,y,xx,yy;
cin>>x>>y>>xx>>yy;
if(!(((abs(x-xx)==1&&y==yy)||(abs(y-yy)==1&&x==xx))&&op[x][y]!=-1&&op[xx][yy]!=-1)){
r=0;
continue;
}
swap(b[x][y],b[xx][yy]);
swap(op[x][y],op[xx][yy]);
sz2++;
while(boom()){
G();
// printb();
sz2++;
}
sz2--;
if(sz2==0){
swap(b[x][y],b[xx][yy]);
swap(op[x][y],op[xx][yy]);
r=0;
continue;
}
cnt++;
sum1+=sz1;
sz1=0;
sum2+=80*(sz2-1)*(sz2-1);
sz2=0;
mainclr[i%5][0]=main1;
mainclr[i%5][1]=main2;
if(cnt==5){
slvsum4();
cnt=0;
}
// cout<<sum1<<" "<<sum2<<" "<<sum3<<"\n";
}
// cout<<sum4<<"\n";
int rs=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(op[i][j]!=-1){
rs=0;
break;
}
}
if(rs==0){
break;
}
}
sum5=r*1000+rs*10000;
// cout<<sum5<<"\n";
cout<<sum1+sum2+sum3+sum4+sum5;
return 0;
}