#include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const ll INF=1LL<<60; typedef pair P; typedef pair PP; const ll MOD=998244353; const int dx[]={-1,0,1,0}; const int dy[]={0,-1,0,1}; int main(){ int N,M,K,T; cin>>N>>M>>K>>T; vector> back(N,vector

(M,make_pair(0,0))); for(int i=0;i>a>>b>>c>>d; a--;b--; back[a][b]=make_pair(c,d); } ll offset=N+M+3; vector dp(N,vector>(M,vector(2*(N+M)+10,INF))); typedef tuple TP; priority_queue,greater> pq; pq.emplace(0,0,0,0); while(!pq.empty()){ auto [val,nowi,nowj,nowt] = pq.top();//valは負の値.ちいさいほうから pq.pop(); ll cost=val; if(dp[nowi][nowj][nowt+offset]<=cost) continue; //dp[nowi][nowj][nowt+offset]>cost dp[nowi][nowj][nowt+offset]=cost; for(int k=0;k<4;k++){ int ni=nowi+dy[k]; int nj=nowj+dx[k]; if(ni<0 || N<=ni || nj<0 || M<=nj) continue; ll totime=nowt+1; if(totime+offset<2*(N+M)+10){ if(dp[ni][nj][totime+offset]>cost ){ pq.emplace(cost,ni,nj,totime); } } } if(back[nowi][nowj]!=make_pair(0LL,0LL)){ auto [ci,di]=back[nowi][nowj]; ll totime = nowt-ci+1; if(totime<-(N+M-2)){ totime=-(N+M-2); } if(dp[nowi][nowj][totime+offset]>(cost+di) ){ pq.emplace((cost+di),nowi,nowj,totime); } } } ll ans=INF; for(int t=0;t<2*(N+M)+10 && t<=T+offset;t++){ ans=min(ans,dp[N-1][M-1][t]); } cout<<(ans==INF?-1:ans)<