Pagini recente » Cod sursa (job #88754) | Cod sursa (job #1065434) | Cod sursa (job #838388) | Cod sursa (job #1562872) | Cod sursa (job #2439073)
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
const int inf = 1 << 30;
void citire(int a[], int& n)
{
cin >> n;
for(int i = 1 ; i <= n ; i++)
cin >> a[i];
}
void rec(int n, int a[], int p[], int val)
{
for(int i = n ; i ; --i)
if(p[i] == val)
{
rec(i-1, a, p, val - 1);
cout << a[i] << ' ';
break;
}
}
int cbin(int st, int dr, int val, int l[])
{
while(st < dr)
{
int m = (st +dr) / 2;
if(l[m] < val)
st = m + 1;
else dr = m;
}
return st;
}
int rez(int a[], int n, int l[], int p[])
{
int sol = 0;
for(int i = 1 ; i <= n ; i++)
{
l[i] = inf;
int k = cbin(1, sol + 1, a[i], l);
if(l[k] == inf)
++sol;
l[k] = a[i];
p[i] = k;
}
return sol;
}
int main()
{
int n;
int a[100005], l[100005], p[100005];
citire(a,n);
int sol = rez(a, n, l, p);
cout << sol << '\n';
rec(n, a, p, sol);
return 0;
}