#include using namespace std; const int nmax=500+42; int n,m; int inp[nmax][nmax]; struct node { int i,j,h; }; node given[nmax*nmax]; bool cmp(node a,node b) { return a.h>b.h; } pair parent[nmax][nmax]; bool print[nmax][nmax]; pair root(pair a) { if(parent[a.first][a.second]==a)return a; parent[a.first][a.second]=root(parent[a.first][a.second]); return parent[a.first][a.second]; } int outp[nmax][nmax]; pair idle; void my_merge(pair u,pair v,int h) { u=root(u); v=root(v); if(u==idle||v==idle)return; if(u==v)return; if(inp[u.first][u.second]inp[i][j])print[i][j]=0; } sort(given+1,given+pointer+1,cmp); for(int i=1;i<=pointer;i++) { int p=given[i].i; int q=given[i].j; parent[p][q]={p,q}; for(int t=0;t<4;t++) { my_merge({p,q},{p+x_[t],q+y_[t]},given[i].h); } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(print[i][j]) { if(outp[i][j]==0)outp[i][j]=inp[i][j]; printf("%i\n",outp[i][j]); } return 0; }