Pagini recente » Cod sursa (job #1865458) | Cod sursa (job #1847139) | Cod sursa (job #1169889) | Cod sursa (job #1850333) | Cod sursa (job #2365789)
#include <iostream>
#include <fstream>
#include <stack>
#define NMAX 100005
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
int N;
int sir[NMAX];
int dp[NMAX];
int origin[NMAX];
stack<int> s;
int rez[NMAX];
int leng;
int BS(int a)
{
int answer = 0;
for(int step = (1 << 29); step; step >>= 1)
{
if(step + answer <= leng && rez[step + answer] < a)
answer += step;
}
return answer;
}
int main()
{
fi >> N;
for(int i = 1; i <= N; ++i)
{
fi >>sir[i];
dp[i] = 1;
origin[i] = 0;
}
rez[1] = 1;
leng = 1;
for(int i = 2; i <= N; ++i)
{
if(sir[i] > sir[rez[leng]])
{
rez[++leng] = i;
origin[i] = rez[leng - 1];
}
else
{
int poz = BS(i);
rez[poz] = i;
origin[i] = rez[poz - 1];
}
}
int index = rez[leng];
while(index)
{
s.push(sir[index]);
index = origin[index];
}
fo << s.size() << "\n";
while(!s.empty())
{
fo << s.top() << " ";
s.pop();
}
}