// Algoritm: ținem un vector sortat cu primele 100 de elemente și un heap cu restul. // Complexitate: O(k + log n) inserare și ștergere #include #define MAX_N 300000 #define MAX_PAGE_SIZE 100 int v[MAX_PAGE_SIZE], nv; int h[MAX_N], nh; int pageSize; void heapInsert(int x) { int pos = nh++, parent = (pos - 1) / 2; while (pos && x < h[parent]) { h[pos] = h[parent]; pos = parent; parent = (parent - 1) / 2; } h[pos] = x; } int heapRemoveMin() { int result = h[0]; h[0] = h[--nh]; int pos = 0, changed = 1; do { int best = pos; if ((2 * pos + 1 < nh) && (h[2 * pos + 1] < h[best])) { best = 2 * pos + 1; } if ((2 * pos + 2 < nh) && (h[2 * pos + 2] < h[best])) { best = 2 * pos + 2; } if (best != pos) { int tmp = h[pos]; h[pos] = h[best]; h[best] = tmp; pos = best; } else { changed = 0; } } while (changed); return result; } // Inserează valoarea x în vectorul sortat void vectorInsert(int x) { int i = nv; while (i && (v[i - 1] > x)) { v[i] = v[i - 1]; i--; } v[i] = x; nv++; } // Elimină și returnează elementul de pe poziția k int vectorRemove(int k) { int result = v[k]; for (int i = k + 1; i < nv; i++) { v[i - 1] = v[i]; } nv--; return result; } void opInsert(int x) { if (nv < pageSize) { vectorInsert(x); } else if (x < v[nv - 1]) { heapInsert(v[--nv]); vectorInsert(x); } else { heapInsert(x); } } int opRemove(int k) { int result = vectorRemove(k); if (nh) { vectorInsert(heapRemoveMin()); } return result; } int main() { int numOps, op, type, arg; FILE *fin = fopen("magazin.in", "r"); FILE *fout = fopen("magazin.out", "w"); fscanf(fin, "%d %d", &numOps, &pageSize); for (op = 0; op < numOps; op++) { fscanf(fin, "%d %d", &type, &arg); if (type == 1) { opInsert(arg); } else { fprintf(fout, "%d\n", opRemove(arg - 1)); } } fclose(fin); fclose(fout); }