Pagini recente » Cod sursa (job #1269834) | Cod sursa (job #1002517) | Cod sursa (job #2524649) | Cod sursa (job #45397) | Cod sursa (job #2485885)
#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 poz)
{
if(st==dr)
return st;
int mijl=(st+dr)/2;
if(x[mijl]==values[poz])
return mijl;
if(x[mijl]<values[poz])
return cautare_binara(mijl+1,dr,poz);
return cautare_binara(st,mijl,poz);
}
void solve()
{
positions[0]=0;
x[0]=values[0];
k_x++;
for(int i=1;i<n;i++)
{
if(values[i]>values[i-1])
positions[i]=positions[i-1]+1,x[k_x++]=values[i];
else
{
int pos=cautare_binara(0,k_x-1,i);
positions[i]=pos;
x[pos]=values[i];
}
if(positions[i]>maximum)
maximum=positions[i], position_maximum=i;
}
}
void create_solution()
{
int anterior=maximum;
solution.push(values[position_maximum]);
for(int i=position_maximum-1;i>=0;i--)
if(positions[i]==anterior-1)
{
anterior=positions[i];
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;
}