лично в моём понимании как раз dsu и должен давать ощутимый выигрыш, когда прилетают рандомные union'ы и добавляются новые элементы через makeSet :)
те реализации, которые я видел, на вики, например, обычно не имели списка всех элементов одного множества, вот, например, та, которую для leetcode/codeforces использую DisjointSetUnion
если по какой-то причине не удалось сжать координаты (id элементов множеств), то придётся хеш таблицы использовать, а не плотные массивы
люди зачем-то использовали disjoint set, там где можно было обойтись обычным dfs'ом, и на этой почве как раз и возник вопрос :)
for (k = 1; k <= n; k++) {
ans += (k*((k%2) ? 1 : -1)*C[k])%MOD*Pow2((n-k)*(n-k-1)/2);
ans %= MOD;
}
GetProcAddress
не получает адрес произвольной функции в произвольном исполняемом файле. Она сделана и работает только для получения адреса специально объявленной функции, (обычно) скомпилированной в dll-ку. Retrieves the address of an exported function (also known as a procedure) or variable from the specified dynamic-link library (DLL).
В дизассемблере видно, что это начало какой-то функции, но я не вижу там никакого вывода в cout. Это точно auth() из поста? Еще, не видно, что там ниже происходит.
Я вижу, что функция по A1040 ожидает что-то полезное в rcx, кажется указатель на указатель на структуру, положенное туда вызывателем. Но там оказывается что-то не то. По смыслу, это какой-то указатель должен быть в параметрах функции. Но auth() не принимает никаких параметров! Сдается мне, что оптимизатор заинлайнил auth() и ее в екзешнике тупо нет. А нашли вы и вызываете что-то не то.
Попробуйте сначала без оптимизаций auth скомпилировать (-O0), тогда ассемблерный код будет понятнее и ее не заинлайнит.
P.s. Вы, вижу, вопрос отредактирвали. Ваш дизассемблер main() показывает, что auth точно заинлайнена. Там нет ее вызова, а сразу вызвыаются функции cout. Удивительно, что там что-то по A1040 вообще есть. Вряд ли это ваша auth().
Кстати, добавив вывод адреса auth в main вы, вероятно, тоже добъетесь, что оптимизатор ее не выкинет.