Pagini recente » Cod sursa (job #977322) | Cod sursa (job #1517286) | Cod sursa (job #1628560) | Cod sursa (job #574342) | Cod sursa (job #2458782)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int dim = 100005;
const int l = 20;
int n,a[dim],pred[dim],pozmin[dim],best[dim];
int cautbin(int val)
{
int pas = 1<<l;
int r = 0;
while (pas != 0)
{
if (r+pas <= n && pozmin[r+pas] <= n && a[pozmin[r+pas]] < val)
{
r += pas;
}
pas /= 2;
}
return r;
}
void afis(int poz)
{
if (pred[poz] == -1)
{
out << a[poz] << " ";
return ;
}
afis(pred[poz]);
out << a[poz] << " ";
}
int main()
{
in >> n;
for (int i=1; i<=n; i++)
{
in >> a[i];
pozmin[i] = n+1;
pred[i] = -1;
}
a[n+1] = 20000000;
int m = 0,j,start;
pred[1] = -1;
pozmin[1] = 1;
pozmin[0] = -1;
for (int i=2; i<=n; i++)
{
j = cautbin(a[i]); /// cel mai mare j cu prop ca a[pozmin[j]] < a[i]
if (m < j+1)
{
m = j+1;
start = i;
}
pred[i] = pozmin[j];
pozmin[j + 1] = i;
}
out << m << "\n";
afis(start);
return 0;
}