void insertSort(vector<int> &a, int L, int R, int g) {
for (int i = L + g ; i <= R ; ++i) {
int v = a[i];
int j = i - g;
while (j >= L && v < a[j]) {
a[j + g] = a[j];
j -= g;
}
a[j + g] = v;
}
}
void shellSort(vector<int> &a, int L, int R) {
vector<int> g;
for (int h = 1 ; h <= R ; h = 3 * h + 1 ) g.emplace_back(h);
reverse(begin(g), end(g));
for (auto &i : g) insertSort(a, L, R, i);
}