# 1.题目概述
~~作者太蒻了,写不出来~~。。。
就是个大模拟,仔细读题吧。
# 2.解析
写点注意事项吧。子弹占用空间要 $ \times 10 $,以消除浮点误差。丢掉子弹的时候一定要找到最早捡到的并且是主副武器均不可使用的。
# 3.AC代码
#include<bits/stdc++.h>
using namespace std;
const int mm = 1005;
int mapp[mm][mm][5];
bool p[mm][mm];
int bb[17][4];//背包。1数量,2时间,3输出时调用
int n,k,l,m,t,kn,xi,yi,KO,qiang1,qiang2,need1,need2,xxx;
void moves(int x){//向四个方向的移动
if(x==1)xi--;
if(x==2)xi++;
if(x==3)yi--;
if(x==4)yi++;
}
int level(int x){
if(x==0) return 0;
if(x==4) return 1;
if(x==3||x==6||x==7) return 2;
if(x==1||x==2||x==5) return 3;
if(x==8||x==9) return 4;
}
void qiang(int x){
int l1,l2,l3;
l1=level(qiang1);l2=level(qiang2);l3=level(x);
if(l3>l1){
qiang1=x;
return;
}
if(l3<l1&&l3>l2){
qiang2=x;
return;
}
}
int space(int x,int y){//计算占用空间时*10,避免浮点误差
if(x==10) return 50*y;
if(x==11) return 40*y;
if(x==12) return 30*y;
if(x==13) return 20*y;
if(x==14) return 2*y;
if(x==15) return y;
if(x==16) return 5*y;
}
int need_fire(int x){//需要的子弹类型
if(x==0) return 0;
if(x==1||x==2||x==3||x==4) return 14;
if(x==5||x==6||x==7) return 15;
if(x==8||x==9) return 16;
}
int up(int x,int y){// x/y 向上取整
if(x%y) return x/y+1;
return x/y;
}
int need_lose(int spa,int x){
if(x==10) return up(spa,50);
if(x==11) return up(spa,40);
if(x==12) return up(spa,30);
if(x==13) return up(spa,20);
if(x==14) return up(spa,2);
if(x==15) return up(spa,1);
if(x==16) return up(spa,5);
}
void take_fire(int spa){
if(kn+spa<=k){
kn+=spa;
bb[mapp[xi][yi][0]][1]+=mapp[xi][yi][1];
bb[mapp[xi][yi][0]][2]=xxx;
}
else{
int p1=1,p2=0;
while(kn+spa>k){
if(p1){
p2=1;
int kkk=1e9,ccf;
for(int i=14;i<=16;i++){
if(bb[i][1]&& i!=need1 && i!=need2){
if(kkk>bb[i][2]){
kkk=bb[i][2];ccf=i;p2=0;
}
}
}
if(p2){
p1=0;continue;
}
int loss=need_lose(kn+spa-k,ccf);
kn-=space(ccf,min(loss,bb[ccf][1]));
bb[ccf][1]=max(0,bb[ccf][1]-loss);
}
else{
int kkk=1e9,ccf;
for(int i=10;i<=16;i++){
if(bb[i][1]){
if(kkk>bb[i][2]){
kkk=bb[i][2];ccf=i;
}
}
}
int loss=need_lose(kn+spa-k,ccf);
kn-=space(ccf,min(loss,bb[ccf][1]));
bb[ccf][1]=max(0,bb[ccf][1]-loss);
}
}
kn+=spa;
bb[mapp[xi][yi][0]][1]+=mapp[xi][yi][1];
bb[mapp[xi][yi][0]][2]=xxx;
}
}
void fight(){
int now1,now2;
now1=bb[need_fire(qiang1)][1];
now2=bb[need_fire(qiang2)][1];
if(now1>=mapp[xi][yi][1]){
bb[need_fire(qiang1)][1]-=mapp[xi][yi][1];
kn-=space(need_fire(qiang1),mapp[xi][yi][1]);
}
else if(now2>=mapp[xi][yi][2]){
bb[need_fire(qiang2)][1]-=mapp[xi][yi][2];
kn-=space(need_fire(qiang2),mapp[xi][yi][2]);
}
else KO=1;
}
void doo(){
if(p[xi][yi]) return;
p[xi][yi]=1;
if(mapp[xi][yi][0]>=1&&mapp[xi][yi][0]<=9){
qiang(mapp[xi][yi][0]);
return;
}
if(mapp[xi][yi][0]>=10&&mapp[xi][yi][0]<=16){
int spa=space(mapp[xi][yi][0],mapp[xi][yi][1]);
need1=need_fire(qiang1);need2=need_fire(qiang2);
take_fire(spa);
}
if(mapp[xi][yi][0]==17) fight();
}
int main(){
int i,j;
cin>>n>>m>>k>>t;
k*=10;
for(i=1;i<=n;i++){//读入地图
for(j=1;j<=m;j++){
cin>>mapp[i][j][0]>>mapp[i][j][1];
if(mapp[i][j][0]==17){
cin>>mapp[i][j][2];
}
}
}
xi=1;yi=1;KO=0;xxx=0;
doo();
for(xxx=1;xxx<=t;xxx++){
cin>>l;
moves(l);
doo();
if(KO){
break;
}
}
if(KO){
printf("%d %d\n",xi,yi);
}
else{
printf("%d\n",qiang1);
printf("%d\n",qiang2);
int p1=1;
while(p1){
p1=0;
int kkk=1e9,ccf;
for(int i=10;i<=16;i++){
if(bb[i][1]){
if(kkk>bb[i][2]){
kkk=bb[i][2];ccf=i;p1=1;
}
}
}
if(p1==0) break;
printf("%d %d\n",ccf,bb[ccf][1]);
bb[ccf][1]=0;
}
}
return 0;
}