Pagini recente » Cod sursa (job #1029562) | Cod sursa (job #2642350) | Cod sursa (job #3258617) | Cod sursa (job #3157379) | Cod sursa (job #1252712)
#include <iostream>
#include<fstream>
using namespace std;
int n, a[100001], c[100001], ind[100001],mn,nr,val;
#define maxv 2000000000
ofstream g("scmax.out");
void citeste()
{
int i;
ifstream f("scmax.in");
f>>n;
for (i=1;i<=n;i++)
f>>a[i];
}
void afisare(int x)
{
int i;
for (i=x;i>=0;i--)
if (ind[i] == nr && (val==-1 || val>a[i]))
{
val = a[i];
nr--;
if (nr>0)
afisare(x-1);
g<<a[i]<<" ";
break;
}
}
void cautare(int st, int dr,int val)
{
int m = (st+dr)/2;
if (st<=dr)
{
if (val>c[m])
cautare(m+1,dr,val);
else
{
if (mn>m) mn=m;
cautare(st,m-1,val);
}
}
}
void solutie()
{
int i;
nr=0;
for (i=1;i<=n;i++)
{
if (nr==0)
{
c[++nr] = a[i];
ind[i] = 1;
}
else
{
mn=nr+1;
if (a[i]<=c[1]) { ind[i]=1; c[1]=a[i]; continue;}
cautare(1,nr,a[i]);
//if (mn == nr && a[i]>c[nr])
// { mn++; nr++; }
c[mn] = a[i];
ind[i] = mn;
if (nr<mn) nr=mn;
}
}
}
int main()
{
citeste();
solutie();
g << nr << '\n';
val = -1;
afisare(n);
}