Pagini recente » Cod sursa (job #1073525) | Cod sursa (job #2114313) | Cod sursa (job #1612812) | Cod sursa (job #1058739) | Cod sursa (job #226730)
Cod sursa(job #226730)
#include<fstream>
#define N 100005
using namespace std;
int v[N],x[N],pred[N],lung[N],n,m;
ifstream in("scmax.in");
ofstream out("scmax.out");
int caut (int a)
{
int s=1,d=m,mij;
while (s!=d)
{
mij=(s+d)/2;
if(a<=v[x[mij]])
d=mij;
else
s=mij+1;
}
if(v[x[s]]<a)
++s;
return s;
}
void citire ()
{
in>>n;
for(int i=1;i<=n;i++)
in>>v[i];
}
int maxim ()
{
int i,m=1;
for(i=1;i<=n;i++)
{
if(lung[m]<lung[i])
m=i;
}
return m;
}
void subsir (int p)
{
if(p==0) return;
subsir(pred[p]);
out<<v[p]<<" ";
}
void parcurg ()
{
int i,poz;
x[1]=1;
pred[1]=0;
lung[1]=1;
m=1;
for(i=2;i<=n;++i)
{
poz=caut(v[i]);//x[poz]=pozitia celui mai mic elem din v care a fost deja prelucrat si este mai mare ca v[i]
x[poz]=i;
lung[i]=poz;
pred[i]=x[poz-1];
if(poz==m+1)
m++;
}
out<<m<<"\n";
poz=maxim();
subsir(poz);
}
int main ()
{
citire ();
parcurg();
in.close();
out.close();
return 0;
}