競技プログラミング日記

主に AtCoder の記事です

第三回 アルゴリズム実技検定 I問題

 

PAST003I

転置のクエリだけが時間がかかるので,そこを何とかする. 転置は2回繰り返すともとに戻るので,回数だけ記録しておく. また,行と列は独立に操作可能.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"


int main() {
  ll n, q;
  cin >> n;
  cin >> q;

  auto f = [&](ll h, ll w) -> ll {
    return n*h + w;
  };
 

  bool tr = false;
  vvll pe(2, vll(n));
  rep(i,2) rep(j,n){
    pe[i][j] = j;
  }

  rep(qi,q){
    ll op, h,w;
    cin >> op;
    if(op == 1){
      cin >> h >> w;  
      --h, --w;

      swap(pe[0^tr][h], pe[0^tr][w]);
    } else if(op == 2){
      cin >> h >> w;      
      --h, --w;  
      swap(pe[1^tr][h], pe[1^tr][w]);
    } else if(op == 3){
      tr ^= 1;

    } else{
      cin >> h >> w;      
      --h, --w;  

      if(tr) swap(h,w);
      h = pe[0][h];
      w = pe[1][w];
      cout << f(h,w) << endl;
    }

  }


  return 0;
}