Pagini recente » Cod sursa (job #2919164) | Cod sursa (job #768427) | Cod sursa (job #513496) | Cod sursa (job #2611451) | Cod sursa (job #1910382)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int nmax = 100005;
int N,k,v[nmax],dp[nmax],lst[nmax];
stack < int > st;
inline int BS(int x)
{
int st,dr,mid;
st = 1; dr = k;
while(st <= dr)
{
mid = (st + dr) >> 1;
if(v[dp[mid]] < x) st = mid+1;
else dr = mid-1;
}
if(x <= v[dp[st]]) return st;
return st-1;
}
inline void Solve()
{
int i,p;
dp[++k] = 1;
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[i] = dp[p-1];
}
}
}
i = dp[k];
while(i != 0)
{
st.push(v[i]);
i = lst[i];
}
fout << k << "\n";
while(!st.empty()){fout << st.top()<<" "; st.pop();}
fout << "\n";
fout.close();
}
int main()
{
int i;
fin >> N;
for(i = 1; i <= N; i++) fin >> v[i];
Solve();
return 0;
}