#include using namespace std; #if __has_include() #include using namespace atcoder; templateistream &operator>>(istream &is,static_modint &a){long long b;is>>b;a=b;return is;} istream &operator>>(istream &is,modint &a){long long b;cin>>b;a=b;return is;} #endif #ifdef LOCAL #include "debug.h" #else #define debug(...) static_cast(0) #define debugg(...) static_cast(0) templateostream &operator<<(ostream &os,const pair&p){os<; templateusing minque=priority_queue,greater>; templatebool chmax(T &a,const T &b){return (abool chmin(T &a,const T &b){return (a>b?(a=b,true):false);} templateistream &operator>>(istream &is,pair&p){is>>p.first>>p.second;return is;} templateistream &operator>>(istream &is,vector &a){for(auto &i:a)is>>i;return is;} templatevoid operator++(pair&a,int n){a.first++,a.second++;} templatevoid operator--(pair&a,int n){a.first--,a.second--;} templatevoid operator++(vector&a,int n){for(auto &i:a)i++;} templatevoid operator--(vector&a,int n){for(auto &i:a)i--;} #define reps(i,a,n) for(int i=(a);i<(n);i++) #define rep(i,n) reps(i,0,n) #define all(x) x.begin(),x.end() #define pcnt(x) __builtin_popcountll(x) ll myceil(ll a,ll b){return (a+b-1)/b;} template auto vec(const int (&d)[n],const T &init=T()){ if constexpr (id(d,init)); else return init; } void SOLVE(); int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); #ifdef LOCAL clock_t start=clock(); #endif int testcase=1; //cin>>testcase; for(int i=0;i>h>>w; vectors(h); cin>>s; vector>dp(h,vector(w,0)); auto ep(dp),fp(dp),gp(dp); rep(i,h)rep(j,w)if(s[i][j]=='.')dp[i][j]=ep[i][j]=fp[i][j]=gp[i][j]=-1; rep(i,h)rep(j,w)if(s[i][j]=='#'&&i&&j)dp[i][j]=dp[i-1][j-1]+1; rep(i,h)for(int j=w;j--;)if(s[i][j]=='#'&&i&&j!=w-1)ep[i][j]=ep[i-1][j+1]+1; for(int i=h;i--;)rep(j,w)if(s[i][j]=='#'&&i!=h-1&&j)fp[i][j]=fp[i+1][j-1]+1; for(int i=h;i--;)for(int j=w;j--;)if(s[i][j]=='#'&&i!=h-1&&j!=w-1)gp[i][j]=gp[i+1][j+1]+1; using Seg=lazy_segtree; vectorsegh(h,Seg(w)),segw(w,Seg(h)),alseg(h+w-1,Seg(min(h,w))); rep(i,h)rep(j,w)if(s[i][j]=='#'){ int mx=min({dp[i][j],ep[i][j],fp[i][j],gp[i][j]}); debug(i,j,mx); if(mx==0)continue; if(i>=j){ segh[i-j].apply(j-mx,j+mx+1,1); } else{ segw[j-i].apply(i-mx,i+mx+1,1); } int id=min(i,w-j-1); alseg[i+j].apply(id-mx,id+mx+1,1); } rep(i,h)rep(j,w)if(s[i][j]=='#'){ if(i>=j){ if(segh[i-j].get(j))continue; } else{ if(segw[j-i].get(i))continue; } if(alseg[i+j].get(min(i,w-j-1)))continue; cout<<"No"<