Pagini recente » Cod sursa (job #464986) | Cod sursa (job #2311411) | Cod sursa (job #679404) | Cod sursa (job #3038441) | Cod sursa (job #2559126)
#include <fstream>
/// subsir crescator de lungime maxima (cu cautare binara)
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, a[100001], q[100001], p[100001], r[100001], lmax;
void citire()
{
f>>n;
for(int i=1; i<=n; ++i)
f>>a[i];
}
int cautare_binara(int x, int a[], int n)
{
int lo=0, hi=n+1, mij;
while(hi-lo>1)
{
mij=(hi+lo)/2;
if(x>a[mij])
lo=mij;
else hi=mij;
}
return hi;
}
void formarePQ()
{
int poz;
q[1]=a[1];
p[1]=1;
lmax=1;
for(int i=2; i<=n; ++i)
{
if(a[i]>q[lmax])
{
q[++lmax]=a[i];
p[i]=lmax;
}
else
{
poz=cautare_binara(a[i], q, lmax);
q[poz]=a[i];
p[i]=poz;
}
}
g<< lmax << '\n';
}
void solutie()
{
int s=lmax;
for(int i=n; i>=1; --i)
{
if(p[i]==s)
{
r[s]=a[i];
--s;
}
if(s==0)
break;
}
for(int i=1; i<=lmax; ++i)
g<< r[i] << ' ';
}
int main()
{
citire();
formarePQ();
solutie();
return 0;
}