Pagini recente » Autentificare | Cod sursa (job #870844) | Cod sursa (job #571825) | Cod sursa (job #3286799) | Cod sursa (job #1741946)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100001;
int V[NMAX], n;
int Best[NMAX], lgmax;
int Father[NMAX];
int L[NMAX];
int nr;
void read()
{
int i;
fin >> n;
for (i = 1; i <= n; ++ i)
fin >> V[i];
}
int caut(int x)
{
int lo, hi, mid;
lo = 0;
hi = lgmax;
while (lo <= hi)
{
mid = lo + (hi - lo) / 2;
if (V[L[mid]] < x && V[L[mid + 1]] >= x)
return mid;
else
if (V[L[mid + 1]] < x)
lo = mid + 1;
else
hi = mid - 1;
}
return lgmax;
}
void solve()
{
int poz, i;
lgmax = 1;
L[0] = 0;
Best[1] = L[1] = 1;
for (i = 2; i <= n; ++ i)
{
poz = caut(V[i]);
Father[i] = L[poz];
Best[i] = poz + 1;
L[poz + 1] = i;
if (lgmax < poz + 1)
lgmax = poz + 1;
}
}
void reconstSol(int poz)
{
if (poz == 0)
return;
reconstSol(Father[poz]);
fout << V[poz] << " ";
}
void print()
{
int i;
fout << lgmax << "\n";
for (i = 1; i <= n; ++ i)
if (Best[i] == lgmax)
{
reconstSol(i);
return;
}
}
int main()
{
read();
fin.close();
solve();
print();
fout.close();
return 0;
}