Pagini recente » Cod sursa (job #1714255) | Cod sursa (job #642692) | Cod sursa (job #823302) | Cod sursa (job #2035841) | Cod sursa (job #2140828)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMax = 100005;
int N;
int v[NMax];
int last[NMax], dad[NMax];
int len;
void Read()
{
fin >> N;
for(int i=1; i<=N; ++i)
fin >> v[i];
for(int i=1; i<=N; ++i)
dad[i] = -1;
}
void Output(int x)
{
if(x==-1)
return;
Output(dad[x]);
fout << v[x] << " ";
}
void BinSea(int i)
{
int st = 1, dr = len, mij;
while(st<=dr)
{
int mij = (st+dr)/2;
if(v[i] > v[last[mij]])
{
st = mij+1;
}
else
{
dr = mij-1;
}
}
last[st] = i;
dad[i] = last[st-1];
}
//2 1 3 4
//-1 4 5 8
int main()
{
Read();
len = 1;
last[1] = 1;
for(int i=2; i<=N; ++i)
{
if(v[i] > v[last[len]])
{
last[++len] = i;
dad[i] = last[len-1];
}
else if(v[i] < v[last[1]])
{
last[1] = i;
dad[i] = -1;
}
else
{
BinSea(i);
}
}
fout << len << "\n";
Output(last[len]);
return 0;
}