ll@n,@m,@h[n]; int x[m],y[m]; rd((x--,y--)(m)); graph g; g.setEdge(n,m,x,y); ll d[n][2]; // tarou kun d[0][0]=0; d[0][1]=0; rep(i,1,n){ // 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]); } } } } } wt(d[n-1][1]); // jirou kun d[n-1][0]=0; d[n-1][1]=0; rrep(i,n-1){ // morau dp j->i d[i][0]=-1; d[i][1]=-1; rep[g.edge[i]](j,g.es[i]){ if(j>i){ if(h[j]>h[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]); } } } } } wt(d[0][1]);