Не проходит по тайм лимиту:
Формат входа. Первая строка содержит исходную строку S, вторая — число запросов q. Каждая из последующих q строк задаёт запрос тройкой чисел i, j, k и означает следующее: вырезать подстроку S[i..j] (где i и j индексируются с нуля) и вставить её после k-го символа оставшейся строки (где k индексируется с единицы), при этом если k = 0, то вставить вырезанный кусок надо в начало.
Формат выхода. Выведите полученную (после всех q запросов) строку.
Ограничения. S содержит только буквы латинского алфавита. 1 ≤
|S| ≤ 300 000; 1 ≤ q ≤ 100 000; 0 ≤ i ≤ j ≤ n−1; 0 ≤ k ≤ n−(j−i+1).
#include <iostream>
#include <string>
using namespace std;
int main() {
string S;
int q;
cin >> S >> q;
S.reserve(S.length() + q); // резервируем память для добавления подстрок
for (int i = 0; i < q; i++) {
int i_pos, j_pos, k_pos;
cin >> i_pos >> j_pos >> k_pos;
string sub = S.substr(i_pos, j_pos - i_pos + 1);
S.erase(i_pos, j_pos - i_pos + 1);
if (k_pos == 0) {
S = sub + S;
} else if (k_pos <= S.length()) {
S.insert(k_pos, sub);
} else {
S += sub;
}
}
cout << S << endl;
return 0;
}