Pagini recente » Cod sursa (job #2354752) | Cod sursa (job #1233470) | Cod sursa (job #1612795) | Cod sursa (job #2385255) | Cod sursa (job #1908885)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int nmax = 100005;
int N,v[nmax],dp[nmax],lst[nmax],k;
stack < int > ans;
inline void Read()
{
fin >> N;
for(int i = 1; i <= N; i++) fin >> v[i];
}
inline int BS(int x)
{
int st,dr,mid,sol = 1;
st = 1; dr = k;
while(st <= dr)
{
mid = (st + dr) >> 1;
if(x > v[dp[mid]]) st = mid+1;
else dr = mid-1;
}
if(v[dp[st]] >= x) return st;
return st-1;
}
inline void Solve()
{
int i,p;
dp[++k] = 1;
lst[1] = 0;
for(i = 2; i <= N; i++)
{
if(v[i] > v[dp[k]])
{
dp[++k] = i;
lst[i] = dp[k-1];
}
else if(v[i] < v[dp[1]])
{
dp[1] = i;
}
else
{
p = BS(v[i]);
if(v[i] <= v[dp[p]])
{
dp[p] = i;
lst[dp[p]] = dp[p-1];
}
}
}
}
inline void Out()
{
fout << k << "\n";
int i = dp[k];
while(i != 0)
{
ans.push(v[i]);
i = lst[i];
}
while(!ans.empty())
{
fout << ans.top() << " ";
ans.pop();
}
}
int main()
{
Read();
Solve();
Out();
return 0;
}