Pagini recente » Cod sursa (job #3031628) | Cod sursa (job #1385174) | Cod sursa (job #3042169) | Cod sursa (job #831192) | Cod sursa (job #1293111)
#include<iostream>
#include<fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
#define nmax 100009;
int v[nmax],q[nmax],p[nmax],n,L,sol[nmax];
void read()
{
in >> n;
for(int i = 1 ; i <= n ; i++)
in >> v[i];
in.close();
}
int bin_search(int val,int left,int right)
{
int mij;
while(left <= right)
{
mij = (left + right)/2;
if(val > q[mij])
left = mij + 1;
else
right = mij - 1;
}
if(left > L)
{
q[++L] = val;
return left;
}
else {
q[left] = val;
return left;
}
}
void buildPQ()
{
q[1] = v[1];
p[1] = 1;
L = 1;
for(int i = 2 ; i <= n ; i++)
{
p[i] = bin_search(v[i],1,L);
}
}
void build_sol()
{
int i,k = n;
for(i = L; i ; i--)
{
while(p[k] != i) k--;
sol[i] = v[k];
}
}
void write_sol()
{
out << L << "\n";
for(int i = 1 ; i <= L ; i++)
out << sol[i] << " ";
out.close();
}
int main()
{
read();
buildPQ();
build_sol();
write_sol();
return 0;
}