Pagini recente » Cod sursa (job #115154) | Cod sursa (job #409708) | Cod sursa (job #1934317) | Cod sursa (job #2836666) | Cod sursa (job #2158162)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,last[100005],a[100005],ind[100005],k=1,t[100005];
int main()
{
f>>n;
for(int i=1; i<=n; i++)
f>>a[i];
last[k]=a[1];
ind[k]=1;
t[1]=0;
for(int i=2; i<=n; i++)
{
int st=1,dr=k,mij;
if(a[i]>last[k])
{
k++;
last[k]=a[i];
ind[k]=i;
t[i]=ind[k-1];
}
else
{
while(st<=dr)
{
mij= (st+dr) /2;
if(a[i]>last[mij])
st=mij+1;
else if(a[i]<last[mij])
dr=mij-1;
else break;
}
last[mij]=a[i];
ind[mij]=i;
t[i]=ind[mij-1];
}
}
g<<k<<'\n';
int poz=1,b[100005];
while(k)
{
b[poz]=a[t[ind[k]]];
poz++;
k--;
}
for(int i=poz-1; i>0; i--)
g<<b[i]<<' ';
return 0;
}