Pagini recente » Cod sursa (job #1069771) | Cod sursa (job #283296) | Cod sursa (job #2942983) | Cod sursa (job #500881) | Cod sursa (job #2365973)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int Nmax = 1e5 + 5;
int a[Nmax], n, lis[Nmax], k, P[Nmax] , sol[Nmax] , d;
int main()
{
int L, R, m, poz;
fin >> n;
for(int i = 1 ; i <= n ; i++)
fin >> a[i];
k = 1;
lis[k] = a[1];
P[1] = 1;
for(int i = 2 ; i <= n ; i++)
if(a[i] > lis[k])
{
lis[++k] = a[i];
P[i] = k;
}
else if(a[i] <= lis[1])
{
lis[1] = a[i];
P[i] = 1;
}
else
{
L = 1;
R = k;
while(L <= R)
{
m = (L + R) / 2;
if(lis[m] >= a[i])
poz = m, R = m - 1;
else L = m + 1;
}
lis[poz] = a[i];
P[i] = poz;
}
int ans = 0 , x;
for(int i = 1 ; i <= n ; i++)
ans = max(ans, P[i]);
fout << ans << "\n";
x = 2e9 + 1;
for(int i = n ; i >= 1 ; i--)
if(P[i] == ans && x > a[i])
{
x = a[i];
sol[++d] = a[i];
--ans;
}
for(int i = d ; i >= 1 ; i--)
fout << sol[i] << " ";
fout << "\n";
fin.close();
fout.close();
return 0;
}