Pagini recente » Cod sursa (job #2665929) | Cod sursa (job #1289812) | Cod sursa (job #2217565) | Cod sursa (job #1286745) | Cod sursa (job #1252709)
#include <iostream>
#include<fstream>
using namespace std;
int n, a[100001], c[100001], ind[100001],mx,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 (c[m]<=val)
{
if (mx<m) mx=m;
cautare(m+1,dr,val);
}
else
cautare(st,m-1,val);
}
}
void solutie()
{
int i,j;
nr=0;
for (i=1;i<=n;i++)
{
if (nr==0)
{
c[++nr] = a[i];
ind[i] = 1;
}
else
{
mx=1;
cautare(1,nr,a[i]);
if (mx == nr && a[i]>c[nr])
{ mx++; nr++; }
c[mx] = a[i];
ind[i] = mx;
}
}
}
int main()
{
citeste();
solutie();
g << nr << '\n';
val = -1;
afisare(n);
}