1 #include <cstdio>
2 #include <queue>
3 #include <cstring>
4 #include <iostream>
5 #include <cstdlib>
6 #include <algorithm>
7 #include <vector>
8 #include <map>
9 #include <set>
10 #include <ctime>
11 #include <cmath>
12 #include <cctype>
13 #define N 1000010
14 #define LL long long
15 #define U unsigned
16 using namespace std;
17 int cas=1,T;
18 int n,m,a[N],x[N],y[N]; //x储存第i行最大值,y储存第i列最大值
19 struct node
20 {
21 int x,y,w;
22 bool operator<(const node&a)const
23 {
24 return w<a.w;
25 }
26 };
27 struct node1
28 {
29 int i,lx,ly,w;
30 bool operator<(const node&a)const
31 {
32 return w>a.w;
33 }
34 };
35 node e[N];
36 int find(int x,map<int,int>&pa)
37 {
38 return pa[x]==x?x:pa[x]=find(pa[x],pa);
39 }
40 int main()
41 {
42 //freopen("1.in","w",stdout);
43 //freopen("1.in","r",stdin);
44 //freopen("1.out","w",stdout);
45 //scanf("%d",&T);
46 scanf("%d%d",&n,&m);
47 for(int i=0;i<n;i++)
48 {
49 for(int j=0;j<m;j++)
50 {
51 int idx=i*m+j;
52 scanf("%d",&e[idx].w);
53 e[idx].x=i;
54 e[idx].y=j;
55 }
56 }
57 sort(e,e+n*m); //排序后从小到大构建
58 //for(int i=0;i<n*m;i++) printf("%d ",e[i].w);printf("\n");
59 //puts("ok");
60 int i=0,end=n*m;
61 while(i<end)
62 {
63 int l=i,r;
64 for(r=i+1;e[l].w==e[r].w;r++); //找出相等的所有数,再将相等的数分集,同一行或同一列会在同一集合
65 //printf("lr:%d %d\n",l,r);
66 map<int,int>pa; //二维并查集,first是原来的点,second是上一个点
67 for(int j=l;j<r;j++)
68 {
69 pa.insert(make_pair(e[j].x,e[j].x));
70 pa.insert(make_pair(e[j].y+N,e[j].x));
71 int xx=find(e[j].x,pa);
72 int yy=find(e[j].y+N,pa);
73 if(xx!=yy) pa[yy]=xx;
74 }
75 map<int,int>val;
76 for(int j=l;j<r;j++)
77 {
78 int minv=0;
79 minv=max(x[e[j].x],y[e[j].y]);
80 minv++;
81 int xx=find(e[j].x,pa);
82 val[xx]=max(val[xx],minv);
83 }
84 for(int j=l;j<r;j++)
85 {
86 int idx=e[j].x*m+e[j].y;
87 a[idx]=val[find(e[j].x,pa)];
88 x[e[j].x]=a[idx];
89 y[e[j].y]=a[idx];
90 }
91 i=r;
92 }
93 //puts("ok");
94 for(int i=0;i<n;i++)
95 {
96 for(int j=0;j<m;j++)
97 {
98 int idx=i*m+j;
99 printf("%d%c",a[idx],j==m-1?'\n':' ');
100 }
101 }
102 //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
103 return 0;
104 }