Pagini recente » Cod sursa (job #2064674) | Cod sursa (job #2813602) | Cod sursa (job #1767352) | Cod sursa (job #569326) | Cod sursa (job #259962)
Cod sursa(job #259962)
#include <fstream>
#define MAX 100001
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int sir[MAX],poz[MAX],tata[MAX],sir_f[MAX];
int lg,n;
void citire()
{
fin>>n;
for (int i=1;i<=n;i++)
fin>>sir[i];
}
void rezolvare()
{
int mij,st,dr;
sir_f[1]=sir[1];
poz[1]=1;
lg=1;
for (int i=2;i<=n;i++)
{
if (sir[i]>sir_f[lg])
{
lg++;
sir_f[lg]=sir[i];
tata[i]=poz[lg-1];
poz[lg]=i;
continue;
}
if (sir[i]<=sir_f[1])
{
sir_f[1]=sir[i];
poz[1]=i;
tata[i]=0;
continue;
}
st=1;
dr=lg;
while (dr-st>1)
{
mij=(st+dr)>>1;
if (sir_f[mij]<sir[i])
st=mij;
else
dr=mij;
}
if (sir[i]<sir_f[dr])
{
poz[dr]=i;
tata[i]=poz[st];
sir_f[dr]=sir[i];
}
}
}
void afishare(int x)
{
if (!x)
return;
afishare(tata[x]);
fout<<sir[x]<<" ";
}
int main ()
{
citire();
rezolvare();
fout<<lg<<"\n";
afishare(poz[lg]);
return 0;
}