#include using namespace std; #define PB push_back #define ZERO (1e-10) #define INF int(1e9+1) #define CL(A,I) (memset(A,I,sizeof(A))) #define DEB printf("DEB!\n"); #define D(X) cout<<" "<<#X": "<B&&A-ZERO pll; typedef vector vi; typedef pair ii; typedef vector vii; #define IN(n) int n;scanf("%d",&n); #define FOR(i, m, n) for (int i(m); i < n; i++) #define F(n) FOR(i,0,n) #define FF(n) FOR(j,0,n) #define FT(m, n) FOR(k, m, n) #define aa first #define bb second void ga(int N,int *A){F(N)scanf("%d",A+i);} struct pt{ double x,y; pt operator-(pt r){return {x-r.x,y-r.y};} pt operator+(pt r){return {x+r.x,y+r.y};} pt operator*(double a){return {x*a,y*a};} double dst(pt r={0,0}){return sqrt((x-r.x)*(x-r.x)+(y-r.y)*(y-r.y));} bool gt(){return ~scanf("%lf%lf",&x,&y);} }B,E,t,q; struct ln{ pt a,b; void gt(){a.gt(),b.gt();} }; pt XY(ln a,ln b){ return {((a.a.x*a.b.y-a.a.y*a.b.x)*(b.a.x-b.b.x)-(a.a.x-a.b.x) *(b.a.x*b.b.y-b.a.y*b.b.x))/((a.a.x-a.b.x)*(b.a.y-b.b.y)-(a.a.y-a.b.y) *(b.a.x-b.b.x)),((a.a.x*a.b.y-a.a.y*a.b.x)*(b.a.y-b.b.y)-(a.a.y-a.b.y) *(b.a.x*b.b.y-b.a.y*b.b.x))/((a.a.x-a.b.x)*(b.a.y-b.b.y)-(a.a.y-a.b.y)*(b.a.x-b.b.x))}; } #define MVS (1000000) #define IW(X) EQ((int(X+ZERO)),(X)) pt mv(pt a,pt b,double p){return a+((b-a)*p);} double S,v[]={.5,-.5}; int W,H,a,l,c; vector A,C; int hg(pt a){if(!c)C[int(a.y)][int(a.x)]=1;return A[int(a.y)][int(a.x)];} int vg(pt a){return C[int(a.y)][int(a.x)];} int main(void){ scanf("%d%d",&W,&H),W/=2,H/=2,B.gt(),E.gt(); F(H){ A.PB(vi(0)),C.PB(vi(0)); FF(W)scanf("%d",&a),A[i].PB(a),C[i].PB(0); } l=hg(B*.5),S=B.dst(E); F(MVS){ t=mv(B,E,(i+1.)/MVS)*.5; if(IW(t.x)||IW(t.y))continue; S+=abs(l-hg(t)),l=hg(t); } if(B.x>E.x)swap(B,E); c=1; FT(int(B.x),int(E.x))if(!(k&1)){ t=XY({B,E},{{double(k),0},{double(k),1}})*.5; if(!IW(t.y))continue; vi u,w; F(2)FF(2){ q={t.x+v[i],t.y+v[j]}; if(vg(q))u.PB(hg(q)); else w.PB(hg(q)); } sort(u.begin(),u.end()),sort(w.begin(),w.end()); if(w[0]>u[1])S+=2*(w[0]-u[1]); } printf("%.12lf\n",S); return 0; }