Pagini recente » Cod sursa (job #2129602) | Cod sursa (job #567532) | Cod sursa (job #859700) | Cod sursa (job #115106) | Cod sursa (job #1896899)
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100005],L[100005],p[100005],mx,best[100005],poz,q,n,nr,i;
stack <int>S;
void CautBin(int st,int dr)
{int mid=(st+dr)/2;
if(st==dr)poz=mid;
else {if(q<=a[L[mid]])CautBin(st,mid);
else if(q>a[L[mid+1]])CautBin(mid+1,dr);
else poz=mid;
}
}
int main()
{fin>>n;
for(i=1;i<=n;i++)
{fin>>a[i];
}
L[1]=1;
L[0]=0;
nr=1;
for(i=2;i<=n;i++)
{q=a[i];
CautBin(0,nr);
if(a[L[poz]]>q)poz--;
L[poz+1]=i;
if(poz+1>nr)nr=poz+1;
p[i]=L[poz];
best[i]=poz+1;
}
fout<<nr<<"\n";
for(i=n;i>=1;i--)
{if(best[i]==nr){while(i!=0){S.push(i);
i=p[i];}
break;
}
}
while(!S.empty())
{fout<<a[S.top()]<<" ";
S.pop();
}
}