Pagini recente » Cod sursa (job #2357670) | Cod sursa (job #1765034) | Cod sursa (job #2207685) | Cod sursa (job #199398) | Cod sursa (job #489151)
Cod sursa(job #489151)
#include <fstream>
using namespace std;
const char InFile[]="scmax.in";
const char OutFile[]="scmax.out";
const int MaxN=100010;
ifstream fin(InFile);
ofstream fout(OutFile);
int X[MaxN],M[MaxN],P[MaxN],n;
int sarci(int val)
{
int p=1,u=M[0],m,sol=1;
while(p<=u)
{
m=(p+u)>>1;
if(val<=X[M[m]])
{
u=m-1;
}
else
{
sol=m;
p=m+1;
}
}
if(X[M[sol]]>val)
{
sol=0;
}
return sol;
}
void afis(int pos)
{
if(pos!=0)
{
afis(P[pos]);
fout<<X[pos]<<" ";
}
}
int main()
{
fin>>n;
for(register int i=1;i<=n;++i)
{
fin>>X[i];
}
fin.close();
M[0]=1;
M[1]=1;
P[1]=0;
for(register int i=2;i<=n;++i)
{
int j=sarci(X[i]);
if(j>0)
{
P[i]=M[j];
if(j+1>M[0])
{
M[j+1]=i;
++M[0];
}
else if(X[i]<X[M[j+1]])
{
M[j+1]=i;
}
}
else
{
P[i]=0;
if(X[i]<X[M[1]])
{
M[1]=i;
}
}
}
fout<<M[0]<<"\n";
afis(M[M[0]]);
fout.close();
return 0;
}