Pagini recente » Cod sursa (job #367405) | Cod sursa (job #2979540) | Cod sursa (job #175494) | Cod sursa (job #895602) | Cod sursa (job #559708)
Cod sursa(job #559708)
#include<fstream>
#define dim 100002
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int a[dim],n;
int lg[dim];
int in[dim];
int p[dim];
int nr=1;
void afisare(int x);
void citire()
{
int i;
f>>n;
for(i = 1;i <= n; i++)
f>>a[i];
}
int cauta(int x)
{
int st,dr,m;
st=0;
dr=nr;
while(st<=dr)
{
m=(st+dr)/2;
if(a[in[m]] < x && a[in[m+1]] >= x)
return m;
else
if(a[in[m+1]] > x)
dr = m - 1;
else
st = m + 1;
}
return nr;
}
void dinamic()
{
int i,poz;
int maxim = 0;
lg[1] = 1;
in[1] = 1;
in[0] = 0;
for(i = 2;i <= n; i++)
{
poz=cauta(a[i]);
in[poz + 1] = i;
lg[i] = poz + 1;
p[ i ] = in[poz];
if(nr < poz + 1)
nr = nr + 1;
}
/*
for(i = 1;i <= n; i++)
g<<in[i]<<" ";
g<<"\n";
for(i = 1;i <= n; i++)
g<<lg[i]<<" ";
g<<"\n";
for(i = 1;i <= n; i++)
g<<p[i]<<" ";
g<<"\n";
*/
for(i = 1;i <= n; i++)
if(maxim < lg[i])
{
maxim = lg[i];
poz = i;
}
g<<maxim<<"\n";
afisare(poz);
}
void afisare(int x)
{
if(p[x] > 0)
afisare(p[x]);
g<<a[x]<<" ";
}
int main()
{
citire();
dinamic();
return 0;
}