Pagini recente » Cod sursa (job #2461409) | Cod sursa (job #528705) | Cod sursa (job #2428727) | Cod sursa (job #349982) | Cod sursa (job #2365802)
#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 st = 1, dr = leng, mij, sol = 0;
while(st <= dr)
{
mij = (st + dr) / 2;
if(sir[a] > sir[rez[mij]])
{
st = mij + 1;
sol = mij;
}
else
dr = mij - 1;
}
return sol + 1;
}
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();
}
}