Pagini recente » Cod sursa (job #307485) | Cod sursa (job #2971759) | Cod sursa (job #2031360) | Cod sursa (job #3140099) | Cod sursa (job #2966822)
#include <fstream>
using namespace std;
string file = "scmax";
ifstream cin(file + ".in");
ofstream cout(file + ".out");
const int N = 100000;
int x[N + 1], n, val_min[N + 1], lung[N + 1];
void citire()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> x[i];
}
int caut_bin(int dr, int val)
{
int st = 1, rez = 0;
while (st <= dr)
{
int mid = (st + dr) / 2;
if (val_min[mid] < val)
{
rez = mid;
st = mid + 1;
}
else
{
dr = mid - 1;
}
}
return rez;
}
void afisare(int l, int i)
{
if (l == 0)
return;
for (; i >= 1; i--)
{
if (lung[i] == l)
{
afisare(l - 1, i-1);
cout << x[i] << ' ';
break;
}
}
}
int main()
{
int n_val_min = 0, l_max(0);
citire();
for (int i = 1; i <= n; i++)
{
int j0 = caut_bin(n_val_min, x[i]);
if (j0 == n_val_min)
n_val_min++;
lung[i] = 1 + j0;
val_min[1 + j0] = x[i];
l_max = max(l_max, lung[i]);
}
cout << l_max << endl;
afisare(l_max,n);
}