ll n,m,h[1d5]; int x[2d5],y[]; graph g; ll d[1d5][2]; void f(int i,bool dir){ // morau dp j->i d[i][0]=-1; d[i][1]=-1; rep[g.edge[i]](j,g.es[i]){ if((jh[i]){ // kudari if(d[j][1]>=0){ d[i][0]>?=d[j][1]; d[i][1]>?=d[j][1]; } }else{ // nobori if(d[j][0]>=0){ d[i][1]>?=d[j][0]+(h[i]-h[j]); } } } } } { rd(n,m,h(n)); rd((x--,y--)(m)); g.setEdge(n,m,x,y); // tarou kun d[0][0]=0; d[0][1]=0; rep(i,1,n){ f(i,true); } wt(d[n-1][1]); // jirou kun d[n-1][0]=0; d[n-1][1]=0; rrep(i,n-1){ f(i,false); } wt(d[0][1]); }