Codeforces 222 B. Cosmic Tables

問題

n行m列の行列が与えられる。
この行列に対して次のようなクエリがk個与えられるので、処理せよ。

  • g x y : x行y列の値を出力する
  • c x y : x列とy列を入れ替える
  • r x y : x行とy行を入れ替える

制約条件

n, m≦1000
k≦5*10^5

方針

愚直に入れ替えるとTLE.


行の入れ替えと、列の入れ替えは順序を入れ替えても結果は変わらない。
なので、現在どの行とどの行が入れ替わっているか、
どの列とどの列が入れ替わっているかだけを覚えておけば、入れ替えがO(1)で出来る。

ソースコード

int h, w, q, a[1000][1000];
int r[1000], c[1000];

int main(){
	scanf("%d%d%d", &h, &w, &q);
	rep(i, h) rep(j, w) scanf("%d", a[i] + j);
	rep(i, h) r[i] = i;
	rep(i, w) c[i] = i;
	
	rep(i, q){
		char t;
		int x, y;
		scanf(" %c%d%d", &t, &x, &y);
		x--; y--;
		if(t == 'g') printf("%d\n", a[r[x]][c[y]]);
		else if(t == 'r') swap(r[x], r[y]);
		else swap(c[x], c[y]);
	}
	
	return 0;
}