Pagini recente » Cod sursa (job #1185157) | Cod sursa (job #766328) | Cod sursa (job #1126594) | Cod sursa (job #1418366) | Cod sursa (job #2325972)
#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;
}