ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

AOJ 3041 - Aizu Competitive Programming Camp 2018 Day 2 C Round And Round

問題

解法

配列の中身をいじるクエリでは、処理後も配列の中身の順番自体は変わらず常に昇順になっています。
ということで、現在の先頭の数字のみがわかっていれば、出力のクエリに対応できます。
具体的には、配列をいじるクエリで、kが入力されたとき、先頭はkだけ大きいものに変わるので、kだけ加算すれば良いです。
出力のときはそのままk番目を出力するだけです。
あとは0-indexと1-indexに気を付けます。
提出コードはこちらになります。

#include <bits/stdc++.h>
using namespace std;

int now = 0, k, n, m, ch;

int main() {
  int i;
  cin >> n >> m;
  for(i = 0; i < m; ++i) {
    cin >> ch >> k;
    if(ch) {
      now += k;
      now %= n;
    }
    else {
      cout << (now + k - 1) % n + 1 << endl;
    }
  }
  return 0;
}