안녕하세요. 오늘은 수열을 돌릴 거예요.
https://www.acmicpc.net/problem/31563
배열을 돌릴 수는 없으므로 [Left,Right]를 돌립시다. 그러면 sum배열 하나만으로도 해결이 가능합니다.
type가 1이면 K에 N-x를 더해줍시다. 이때 x를 빼는것이 아닌 N-x를 더해주는 이유는 K가 음수이면 곤란해지기 때문입니다.
#include <iostream>
#define ll long long
using namespace std;
ll sum[202020] = { 0 };
int main(void)
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
ll Left, Right, K = 0, x, type, i, N, M;
cin >> N >> M;
for (i = 1; i <= N; i++)
{
cin >> x;
sum[i] = sum[i - 1] + x;
}
for (i = 0; i < M; i++)
{
cin >> type;
if (type == 1)
{
cin >> x;
K += N - x;
}
if (type == 2)
{
cin >> x;
K += x;
}
if (type == 3)
{
cin >> Left >> Right;
Left = (Left + K - 1) % N + 1;
Right = (Right + K - 1) % N + 1;
if (Left <= Right) cout << sum[Right] - sum[Left - 1] << "\n";
else cout << sum[N] - sum[Left - 1] + sum[Right] << "\n";
}
}
}
감사합니다.