#include<stdio.h> #include<string.h> #include<math.h> #include<queue> using namespace std; const int V = 808, E=400000; const double INF=1e5; double d[V],cost[E]; int n,m,verNum; int head[V],pnt[E],nxt[E],e; int cnt[V]; double u,l; void addedge(int u,int v,double c) { pnt[e]=v; cost[e]=c; nxt[e]=head[u]; head[u]=e++; } bool relax(int u,int v,double w) { if(d[v]>d[u]+w) { d[v]=d[u]+w; return 1; } return 0; } int spfa() { int vis[V]; int i; //int Q[E]; queue<int> Q; for(i=1;i<verNum;++i) { cnt[i] = 0; d[i]=INF; vis[i]=0; } vis[0]=1; d[0]=0; cnt[0] = 1; //int top=1; //Q[0]=0; Q.push(0); int u,v; double w; int nm = sqrt(verNum * 1.0); //涓寮归借跺澶╁ㄦ while(!Q.empty()) { //u=Q[--top]; u = Q.front(); Q.pop(); vis[u]=0; for(i=head[u];i!=-1;i=nxt[i]) { v=pnt[i]; w=cost[i]; if(relax(u,v,w) && !vis[v]) { if(++cnt[v] > nm) return 0; //Q[top++]=v; Q.push(v); vis[v]=1; } } } return 1; } int main() { while(scanf("%d%d%lf%lf",&n,&m,&l,&u) == 4) { double c,ll = log(l),uu = log(u); int i,j; verNum = n + m; memset(head,-1,sizeof(head)); e = 0; for(i = 0; i < n; ++i) for(j = 0; j < m; ++j) { scanf("%lf",&c); c = log(c); addedge(i,j+n,c-ll); addedge(j+n,i,uu-c); } if(spfa()) printf("YES\n"); else printf("NO\n"); } return 0; }