Cod sursa(job #1347726)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 19 februarie 2015 09:58:21
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>

using namespace std;

#define fileIn "matperm2.in"
#define fileOut "matperm2.out"

#define maxN 1004
#define maxM 1004

#define maxQ 1001
#define maxP 2000000005

struct coord
{
    short x, y;
};

short base, baseSol;
coord perm[2][maxN][maxM];
coord sol[2][maxN][maxM];

int n, m;

void addSol()
{
    int i, k;

    for ( i = 1; i <= n; ++i )
    {
        for ( k = 1; k <= m; ++k )
        {
            sol[!baseSol][i][k] = sol[baseSol][perm[base][i][k].x][perm[base][i][k].y];
        }
    }
    baseSol = !baseSol;
}

void powerUp()
{
    int i, k;

    for ( i = 1; i <= n; ++i )
    {
        for ( k = 1; k <= m; ++k )
        {
            perm[!base][i][k] = perm[base][perm[base][i][k].x][perm[base][i][k].y];
        }
    }

    base = !base;
}

int main()
{
    ifstream sIn( fileIn );
    ofstream sOut( fileOut );


    int p, i, k, q;

    sIn >> n >> m >> p;

    int yt, xt, x0, y0;

    for ( i = 1; i <= n; ++i )
    {
        sIn >> yt;
        for ( k = 1; k <= m; ++k )
        {
            sol[baseSol][yt][k].x = perm[base][yt][k].x = i;
        }
    }

    for ( i = 1; i <= m; ++i )
    {
        sIn >> yt;
        for ( k = 1; k <= n; ++k )
        {
            sol[baseSol][k][yt].y = perm[base][k][yt].y = i;
        }
    }


    sIn >> q;
    for ( i = 1; i <= q; ++i )
    {
        sIn >> x0 >> y0 >> xt >> yt;

        sol[baseSol][x0][y0] = perm[base][xt][yt];
        sol[baseSol][xt][yt] = perm[base][x0][y0];
        perm[base][x0][y0] = sol[baseSol][x0][y0];
        perm[base][xt][yt] = sol[baseSol][xt][yt];
    }

    --p;
    for ( i = 0; i < 32; ++i )
    {
        if ( p & ( 1 << i ) )
        {
            addSol();
            p -= ( 1 << i );
        }
        if ( !p )
            break;
        powerUp();
    }


    for ( i = 1; i <= n; ++i )
    {
        for ( k = 1; k < m; ++k )
            sOut << ( sol[baseSol][i][k].x - 1 ) * m + sol[baseSol][i][k].y << ' ';

        sOut << ( sol[baseSol][i][k].x - 1 ) * m + sol[baseSol][i][k].y;

        sOut << '\n';
    }

    return 0;
}