Пусть есть код:

for (int i = 0; i < n; ++i) {
    // do something w.r.t. i
}

Пусть алгоритм внутри цикла независимо обрабатывает разные индексы - то есть результат не меняется от того в каком порядке обрабатываются i, и не меняется от того что они обрабатываются одновременно.

Тогда мы могли бы одновременно обрабатывать не просто какой-то один индекс i, а столько параллельных значений i сколько у вас ядер процессора (CPU). А это линейное ускорение!

Для этого нужно (см. коммит)

1) подключить OpenMP библиотеку (на windows и linux является частью C++ компилятора, на macos бывают сложности)

2) добавить у этого цикла простое указание что он должен выполняться параллельно:

#pragma omp parallel for
for (int i = 0; i < n; ++i) {
    // do something w.r.t. i
}

Задание Попробуйте сделать это с морфологией - какое ускорение вы бы ожидали? Сколько ядер у вашего CPU? Какое ускорение вы пронаблюдали на практике? Попробуйте запустить несколько раз для надежности.

Не используйте на олимпиадах!

Потому что там почти наверняка об этом знают, и замеряют процессорное время, а не время в секундах.