Cod sursa(job #2543189)

Utilizator betybety bety bety Data 10 februarie 2020 22:13:33
Problema Piese Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
using namespace std;
ifstream cin("piese.in");
ofstream cout("piese.out");
int v[505][505];
int n,m,rasp;
void solve(int x,int y)
{
    if(x>n or y>m) return;
    int put=1;
    while(x+put-1<=n and y+put-1<=m)
        put*=2;
    put/=2;
    ++rasp;
    v[x][y]+=rasp;
    v[x][y+put]-=rasp;
    v[x+put][y]-=rasp;
    v[x+put][y+put]+=rasp;
    int cpy=put,i=x+put;
    while(i<=n)
    {
        while(put>n-i+1)
            put/=2;
        for(int j=y;j<y+cpy;j+=put)
        {
            ++rasp;
            v[i][j]+=rasp;
            v[i][j+put]-=rasp;
            v[i+put][j]-=rasp;
            v[i+put][j+put]+=rasp;
        }
        i+=put;
    }
    put=cpy;
    i=y+put;
    while(i<=m)
    {
        while(put>m-i+1)
            put/=2;
        for(int j=x;j<x+cpy;j+=put)
        {
            ++rasp;
            v[j][i]+=rasp;
            v[j][i+put]-=rasp;
            v[j+put][i]-=rasp;
            v[j+put][i+put]+=rasp;
        }
        i+=put;
    }
    solve(x+cpy,y+cpy);
}
int main()
{
    cin>>n>>m;
    solve(1,1);
    cout<<rasp<<'\n';
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            v[i][j]+=v[i-1][j]+v[i][j-1]-v[i-1][j-1];
            cout<<v[i][j]<<' ';
        }
        cout<<'\n';
    }
    return 0;
}