Codeforces 400(#234 Div2 only) C Inna and Huge Candy Matrix

問題

n行m列のグリッドにp個キャンディが置いてあって、i番目のキャンディはx[i]行y[i]列にある。
このグリッドをx回時計回りに90度、y回水平反転を、z回半時計回りに90度回転させる。


操作の後でそれぞれのキャンディは何行何列にあるか出力せよ。

制約条件

n, m≦10^9
x, y, z≦10^9
p≦10^5

方針

回転は4回やると戻るので4で割った余りを取ればいい。
反転は2回やると戻るので奇数のときだけ1回反転すればいい。


なので座標が変わる回数は高々8回とかそれくらいなので、
それぞれのキャンディごとに愚直に回転すれば間に合う。


反時計回りは時計回りを3回やればいい。
幅W, 高さHのグリッドを時計回りに回転させると、(x, y)は
(H + 1 - y, x)にうつる。で、W, Hが入れ替わる。

ソースコード

void rot(int &h, int &w, int &y, int &x){
	int ny = x;
	int nx = h + 1 - y;
	y = ny;
	x = nx;
	swap(h, w);
}

int main(){
	
	int h, w, a, b, c, p;
	cin >> h >> w >> a >> b >> c >> p;
	a %= 4;
	b %= 2;
	c %= 4;
	
	while(p--){
		
		int x, y;
		cin >> y >> x;
		
		int th = h, tw = w;
		rep(it, a) rot(th, tw, y, x);
		if(b) x = tw + 1 - x;
		rep(it, 4 - c) rot(th, tw, y, x);
		
		cout << y << " " << x << endl;
	}
	
	return 0;
}