Pagini recente » Cod sursa (job #1401024) | Cod sursa (job #2414729) | Cod sursa (job #2976302) | Istoria paginii runda/nt_gim | Cod sursa (job #1945919)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int Nmax=100005;
int N,X[Nmax],pre[Nmax],D[Nmax],poz,L;
stack <int> st;
void read()
{
fin>>N;
for(int i=1;i<=N;i++)
{
fin>>X[i];
}
}
void solve()
{
X[0]=1<<30;
for(int i=1;i<=N;i++)
{
int st=1;
int dr=L;
while(st<=dr)
{
int mid=(st+dr)/2;
if(X[D[mid]]<X[i])
{
poz=mid;
st=mid+1;
}
else
{
dr=mid-1;
}
}
if(X[i]<X[D[poz+1]])
{
D[poz+1]=i;
pre[D[poz+1]]=D[poz];
}
L=max(L,poz+1);
}
poz=D[L];
fout<<L<<"\n";
while(pre[poz])
{
st.push(X[poz]);
poz=pre[poz];
}
while(!st.empty())
{
fout<<st.top()<<" ";
st.pop();
}
}
int main()
{
read();
solve();
return 0;
}