#include #include #include std::ifstream fin ("test.in"); int readInt() { int x; fin >> x; return x; } void printInt(int x) { std::cout << x << ' '; } struct ListaNod { int info1, info2; ListaNod *urm; }; ListaNod* addInceputLista(ListaNod *lista, int info1, int info2) { __asm { push dword ptr 12; call malloc; add esp, 4; // eax e pointer catre nod mov ebx, [ebp+12]; mov dword ptr [eax], ebx; mov ebx, [ebp+16]; mov dword ptr [eax]+4, ebx; mov dword ptr [eax]+8, 0; mov ebx, [ebp+8]; mov ecx, [ebx]; // ecx e lista veche test ecx, ecx; jz _iesi_afara; mov dword ptr [eax]+8, ecx; jmp _iesi_afara; _iesi_afara:; // returnam eax }; } struct HeapNod { int info, key; }; int heap_n = 0; HeapNod heap[2'000'000]; void swapHeapNodes(HeapNod* a, HeapNod *b) { __asm { mov eax, [ebp+8]; mov ebx, [ebp+12]; mov esi, [eax]; mov edi, [ebx]; mov [eax], edi; mov [ebx], esi; mov esi, [eax+4]; mov edi, [ebx+4]; mov [eax+4], edi; mov [ebx+4], esi; }; } void insertHeap(int info, int key) { __asm { lea eax, heap; mov ecx, heap_n; inc ecx; mov heap_n, ecx; mov esi, [ebp+8]; mov edi, [ebp+12]; mov [eax+ecx*8], esi; mov [eax+ecx*8+4], edi; mov esi, heap_n; _heap_loop: cmp esi, 1; je _end_heap_loop; mov edi, esi; shr edi, 1; // edi is esi's father mov ebx, [eax+edi*8+4]; // edi--ebx mov ecx, [eax+esi*8+4]; // esi--ecx cmp ebx, ecx; jle _end_heap_loop; push esi; push eax; shl edi, 3; add edi, eax; push edi; shl esi, 3; add esi, eax; push esi; call swapHeapNodes; add esp, 8; pop eax; pop esi; shr esi, 1; jmp _heap_loop; _end_heap_loop: }; } void popHeap() { __asm { lea eax, heap; mov esi, heap_n; shl esi, 3; add esi, eax; mov edi, 1; shl edi, 3; add edi, eax; push edi; push esi; call swapHeapNodes; add esp, 8; dec heap_n; mov edx, 1; _heap_loop_2: // start loop mov esi, edx; shl esi, 1; mov edi, esi; or edi, 1; // esi - left, edi - right lea eax, heap; cmp heap_n, esi; jl _end_heap_loop_2; mov ecx, 0 //flags!! // verify left mov ebx, [eax+edx*8+4]; cmp ebx, [eax+esi*8+4]; jle _dontgo_left; or ecx, 1; // can go left _dontgo_left:; // verify right cmp heap_n, edi; jl _dontgo_right; mov ebx, [eax+edx*8+4]; cmp ebx, [eax+edi*8+4]; jle _dontgo_right; or ecx, 2; // can go right _dontgo_right:; // verify left