Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define pfin(a) printf("%d\n",a);
- #define pfis(a) printf("%d ",a);
- #define sfi(a) scanf("%d",&a);
- #define f(i,a,b) for(int i=a;i<b;i++)
- #define pb(a) push_back(a);
- #define vi vector<int>
- struct util
- {
- int val,node;
- };
- bool cmp(util a,util b)
- {
- return a.val<b.val;
- }
- vi g[100005];
- int in[100005]={0};
- int ans[100005];
- void toposort(int n)
- {
- queue<int>q;
- f(i,0,n)
- {
- if(in[i]==0)
- {
- q.push(i);
- ans[i]=1;
- }
- }
- while(!q.empty())
- {
- int u=q.front();
- q.pop();
- for(int i=0;i<g[u].size();i++)
- {
- int v=g[u][i];
- in[v]--;
- if(in[v]==0)
- {
- ans[v]=ans[u]+1;
- q.push(v);
- }
- }
- }
- }
- int main()
- {
- int r,c;
- sfi(r)
- sfi(c)
- util rows[r][c];
- util cols[c][r];
- int mat[r][c];
- f(i,0,r)
- {
- f(j,0,c)
- {
- sfi(mat[i][j]);
- rows[i][j].val=mat[i][j];
- rows[i][j].node=(i*c)+j;
- cols[j][i].val=mat[i][j];
- cols[j][i].node=(i*c)+j;
- }
- }
- f(i,0,r)
- sort(rows[i],rows[i]+c,cmp);
- f(i,0,c)
- sort(cols[i],cols[i]+r,cmp);
- f(i,0,r)
- {
- f(j,0,c-1)
- {
- if(rows[i][j].val<rows[i][j+1].val)
- {
- g[rows[i][j].node].pb(rows[i][j+1].node)
- in[rows[i][j+1].node]++;
- }
- }
- }
- f(i,0,c)
- {
- f(j,0,r-1)
- {
- if(cols[i][j].val<cols[i][j+1].val)
- {
- g[cols[i][j].node].pb(cols[i][j+1].node)
- in[cols[i][j+1].node]++;
- }
- }
- }
- toposort(r*c);
- for(int i=0;i<r*c;i++)
- {
- pfis(ans[i])
- if((i+1)%c==0)
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement