Pagini recente » Cod sursa (job #265169) | Cod sursa (job #1132323) | Cod sursa (job #1472962) | Cod sursa (job #1801017) | Cod sursa (job #2841494)
#include <iostream>
#include <fstream>
#define maxi 100005
using namespace std;
ifstream f("scmax.in",ios::in);
ofstream g("scmax.out",ios::out);
int dp[maxi],v[maxi],poz[maxi],n,sclm[maxi],r;
void read()
{
f>>n;
for(int i=1;i<=n;i++)
f>>*(v+i);
f.close();
return;
}
void dinamica()
{
int k=0;
dp[++k]=v[1];
poz[1]=1;
for(int i=2;i<=n;i++)
{
if(v[i]>dp[k])
{
dp[++k]=v[i];
poz[i]=k;
}
else if(v[i]==dp[k])
{
poz[i]=k;
}
else{
int st=1,dr=k,p=k+1;
while(st<=dr)
{
int mid=(st+dr)>>1;
if(dp[mid]>v[i])
{
p=mid;
dr=mid-1;
}
else st=mid+1;
}
dp[p]=v[i];
poz[i]=p;
}
}
int j=n;
for(int i=k;i>=1;i--)
{
while(poz[j]!=i)
j--;
sclm[++r]=v[j];
}
g<<k<<'\n';
for(int i=r;i>=1;i--)
g<<sclm[i]<<" ";
g.close();
return;
}
int main()
{
read();
dinamica();
return 0;
}