Pagini recente » Cod sursa (job #1566356) | Cod sursa (job #592330) | Cod sursa (job #551733) | Cod sursa (job #2152025) | Cod sursa (job #2523882)
#include <fstream>
#define input "scmax.in"
#define output "scmax.out"
#define NMAX 100005
using namespace std;
ifstream in(input);
ofstream out(output);
int sir[NMAX], liss[NMAX], previ[NMAX], N, L, previ_pos[NMAX];
void Read_Data()
{
in >> N;
for(int i = 1; i <= N; i++)
in >> sir[i];
}
int Binary_Search(int st, int dr, int x)
{
int sol = 0;
while(st <= dr)
{
int midd = (st + dr) / 2;
if(liss[midd] <= x)
{
if(liss[midd] == x) sol = midd;
else sol = midd + 1;
st = midd + 1;
}
else dr = midd - 1;
}
return sol;
}
void Print_Sol(int x)
{
if(previ[x]) Print_Sol(previ[x]);
out << sir[x] << " ";
}
void Solve()
{
liss[1] = sir[1], previ_pos[1] = 1;
L = 1;
for(int i = 2; i <= N; i++)
{
if(sir[i] < liss[1])
liss[1] = sir[i], previ_pos[1] = i;
else if(sir[i] > liss[L])
previ[i] = previ_pos[L], liss[++L] = sir[i], previ_pos[L] = i;
else
{
int poz = Binary_Search(1, L, sir[i]);
previ[i] = previ_pos[poz - 1];
liss[poz] = sir[i], previ_pos[poz] = i;
}
}
out << L << "\n";
Print_Sol(previ_pos[L]);
}
int main()
{
Read_Data();
Solve();
return 0;
}