Cod sursa(job #2325972)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 23 ianuarie 2019 11:36:04
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb
#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pi;

int n, m, t, v[1005][1005], p[1005][1005], ans[1005][1005], lin[1005], col[1005], where[1005*1005], test, aib[1005*1005];
bool ok[1005][1005];

void update(int idx, int x)
{
    while(idx < 1005*1005){
        aib[idx] += x;
        idx += (idx&-idx);
    }
}

int query(int x)
{
    int sol = 0;
    while(x){
        sol += aib[x];
        x -= (x&-x);
    }
    return sol;
}

void prod(int a[][1005], int b[][1005])
{
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j){
            int x = (b[i][j]-1)/m+1;
            int y = b[i][j]-(x-1)*m;
            ans[i][j] = a[x][y];
        }
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            a[i][j] = ans[i][j];
}

int main()
{
    ifstream fin ("matperm2.in");
    ofstream fout ("matperm2.out");
    fin >> n >> m >> t;
    for (int i = 1; i <= n; ++i)
        fin >> lin[i];
    for (int i = 1; i <= m; ++i)
        fin >> col[i];
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            v[i][j] = (lin[i]-1)*m+col[j];
    fin >> test;
    while(test--){
        int x, y, a, b;
        fin >> x >> y >> a >> b;
        swap(v[x][y], v[a][b]);
    }
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            if(!ok[i][j]){
                int x = i, y = j;
                vector<int> cycles;
                while(!ok[x][y]){
                    ok[x][y] = 1;
                    cycles.push_back((x-1)*m+y);
                    update((x-1)*m+y, 1);
                    where[(x-1)*m+y] = cycles.size();
                    int newx = (v[x][y]-1)/m+1;
                    int newy = v[x][y]-(newx-1)*m;
                    x = newx;
                    y = newy;
                }
                for (auto x : cycles)
                    update(x, -1);
            }
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            p[i][j] = (i-1)*m+j;
    /*while(t)
        if(t%2 == 0){
            prod(v, v);
            t /= 2;
        }else{
            prod(p, v);
            --t;
        }*/
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j)
            fout << p[i][j] << " ";
        fout << "\n";
    }
    return 0;
}