Pagini recente » Cod sursa (job #37111) | Cod sursa (job #1869996) | Cod sursa (job #2879702) | Cod sursa (job #899587) | Cod sursa (job #1015973)
#include <fstream>
#define nmax 100005
using namespace std;
int Q[nmax], P[nmax], a[nmax];
int n;
ofstream fout("scmax.out");
void citire()
{
ifstream fin("scmax.in");
fin >> n;
for (int i = 1; i <= n; i++)
fin >> a[i];
}
int cautare_binara(int st, int dr, int x)
{
int mijl = (st+dr)/2;
if (st >= dr)
return st;
if (x < Q[mijl])
return cautare_binara(st, mijl, x);
if (x > a[mijl])
return cautare_binara(mijl+1, dr, x);
}
void rezolvare()
{
for (int i = 1; i <= n; i++)
{
/// P[i] = pozitia lui a[i] in Q
P[i] = cautare_binara(1, Q[0], a[i]);
if (P[i] > Q[0] || a[i] > Q[Q[0]])
P[i] = ++Q[0];
Q[P[i]] = a[i];
}
}
void afisare(int i, int indx)
{
while (i >= 1 && indx >= 1)
{
if (P[i] == indx)
{
afisare(i-1,indx-1);
fout << a[i] << ' ';
return;
}
i--;
}
}
int main()
{
citire();
rezolvare();
fout << Q[0] << '\n';
afisare(n, Q[0]);
return 0;
}