DijkstraHeap<int>h; int@n,@m,@k,@a[n][m]; h.malloc(9d4); int ok=1,ng=1d9+1; while(ok+1<ng){ int t=ok+ng>>1; h.init(9d4); h.change(0,a[0][0]<t); while(h.size){ int i=h.pop(); int v=h.val[i]; int y=i/300; int x=i%300; if(y) h.change(i-300,v+(a[y-1][x]<t)); if(y<n-1) h.change(i+300,v+(a[y+1][x]<t)); if(x) h.change(i- 1,v+(a[y][x-1]<t)); if(x<m-1) h.change(i+ 1,v+(a[y][x+1]<t)); } if(h.val[(n-1)*300+(m-1)]<=k){ ok=t; }else{ ng=t; } } wt(ok);