Pagini recente » Cod sursa (job #2148781) | Cod sursa (job #350086) | Cod sursa (job #159073) | Cod sursa (job #369801) | Cod sursa (job #1658301)
#include <fstream>
#define DMAX 100010
using namespace std;
FILE *fin, *fout;
int n, v[DMAX], a[DMAX], poz[DMAX], sol[DMAX], lgmax, lg;
void construct(); //construiesc dinamic un subsir crescator maximal si retin in vectorul auxiliar poz pozitia fiecarui element in acest subsir
int cautare_binara(int x); //caut pozitia fiecarui element in subsirul curent
void solutie(); //reconstitui solutia plimbandu-ma inapoi prin vectorul poz
int main()
{
int i;
fin = fopen("scmax.in", "r");
fout = fopen("scmax.out", "w");
fscanf(fin, "%d", &n);
construct();
solutie();
fprintf(fout, "%d\n", lgmax);
for (i = 1; i <= lgmax; i++)
fprintf(fout, "%d ", sol[i]);
fprintf(fout, "\n");
fclose(fout);
return 0;
}
void construct()
{
int i, pozx;
for (i = 1; i <= n; i++)
{
fscanf(fin, "%d", &v[i]);
pozx = cautare_binara(v[i]);
if (pozx > lg)
lg = pozx;
a[pozx] = v[i];
poz[i] = pozx;
if (pozx > lgmax)
lgmax = pozx;
}
}
int cautare_binara(int x)
{
int st = 1, dr = lg, mij;
while (st <= dr)
{
mij = (st + dr) / 2;
if (x == a[mij]) return mij;
if (x < a[mij])
dr = mij - 1;
else
st = mij + 1;
}
return st;
}
void solutie()
{
int i, copie = lgmax;
for (i = n; i >= 1 && copie; i--)
{
if (poz[i] == copie)
{
sol[copie] = v[i];
copie--;
}
}
}