Cod sursa(job #125127)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 20 ianuarie 2008 11:31:42
Problema Piese Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 9-a Marime 1.03 kb
#include <fstream.h>




int k,m,n,i,j,min,d1,d2,p,a[500][500];

int lgtm(int x){
int s=0,i,p;
while (x) {
s=s+1;
x=x/2;
}
p=1;
for (i=1;i<=s-1;i++)
p=p*2;
return p;
}

void lung(int x,int y,int m,int n);



void lat(int x,int y,int m, int n)
{
int p,k,i,j;
p=lgtm(n);
for (k=1;k<=m/p;k++){
::min=::min+1;
for (j=(k-1)*p+1;j<=k*p;j++)
for (i=1;i<=p;i++)
::a[x+i-1][y+j-1]=::min;
}

if (n!=p) lat(x+p,y,m,n=p);
if (m%p!=0) lung(x,y+(n/p)*p,m-(n/p)*p,n);
}



void lung(int x,int y,int m, int n)
{
int p,k,i,j;
p=lgtm(m);
for (k=1;k<=n/p;k++) {
::min=::min+1;
for (i=(k-1)*p+1;i<=k*p;i++)
for (j=1;j<=p;j++)
::a[x+i-1][y+j-1]=::min;
}

if (m!=p) lung(x,p+y,m-p,n);
if (n%p!=0) lat((n/p)*p+x,y,p,n-(n/p)*p);


}






int main(){


min=0;

ifstream fin("piese.in");
ofstream fout("piese.out");
fin>>n;
fin>>m;
if (m>n) {i=m; m=n; n=i;}

lung(1,1,m,n);

fout<<min;
fout<<endl;
for (i=1;i<=n;i++){
for (j=1;j<=m;j++)
fout<<' '<<a[i][j];
fout<<endl;
}
fout.close();
return 0;
}