Pagini recente » Cod sursa (job #1652338) | Cod sursa (job #705973) | Cod sursa (job #1314870) | Cod sursa (job #3170765) | Cod sursa (job #2485925)
#include <iostream>
#include <fstream>
#include <stack>
#define MAXN 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,values[MAXN],x[MAXN],positions[MAXN];
int maximum=-1, position_maximum=-1;
int k_x;
stack <int> solution;
void citire()
{
fin>>n;
for(int i=0;i<n;i++)
fin>>values[i];
}
int cautare_binara(int st, int dr, int value)
{
if(st==dr)
return st;
int mijl=(st+dr)/2;
if(x[mijl]==value)
return mijl;
if(x[mijl]<value)
return cautare_binara(mijl+1,dr,value);
return cautare_binara(st,mijl,value);
}
void solve()
{
int current_position=1;
x[0]=values[0];
for(int i=1;i<n;i++)
{
int poz;
if(values[i]>x[current_position-1])
{
poz=current_position;
current_position++;
}
else
poz=cautare_binara(0,current_position-1,values[i]);
x[poz]=values[i];
positions[i]=poz;
if(poz>maximum)
{
maximum=poz;
position_maximum=i;
}
}
}
void create_solution()
{
int aux_max=maximum;
for(int i=position_maximum;i>=0&&aux_max>=0;i--)
if(positions[i]==aux_max)
{
aux_max--;
solution.push(values[i]);
}
}
void print_solution()
{
fout<<maximum+1<<"\n";
while(!solution.empty())
{
fout<<solution.top()<<" ";
solution.pop();
}
}
int main()
{
citire();
solve();
create_solution();
print_solution();
return 0;
}