#include using namespace std; typedef long long ll; templatebool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b struct SparseTable{ using F=function; int n,logn; vector> dat; vector loglen; F f; T ti; SparseTable(int n_,F f,T ti) :f(f),ti(ti){ n=1; logn=1; while(n(1<<(j+1))) j++; } dat.resize(logn); for(int i=0;i &v){ for(int j=0;j=n+1) vr=ti; else vr=dat[i-1][j+(1<<(i-1))]; dat[i][j]=f(vl,vr); } } } T query(int l,int r){ if(l>=r) return ti; T vl=dat[loglen[r-l]][l],vr=dat[loglen[r-l]][r-(1<>H>>W; vector S(H); for(int i=0;i>S[i]; vector dp(W,0); for(int i=H-2;i>=0;i--){ vector nex(W); SparseTable spa(W,[](int a,int b){return min(a,b);},INF); spa.set(dp); spa.built(); vector kabe={-1}; for(int j=0;j1){ int mid=(left+right)/2; int l=j-mid,r=j+mid; chmax(l,0); chmin(r,W-1); chmax(l,L); chmin(r,R); int z=spa.query(l,r+1); if(z<=mid) right=mid; else left=mid; } nex[j]=right; } dp=nex; } for(int j=0;j