Pagini recente » Cod sursa (job #3252054) | Cod sursa (job #106611) | Cod sursa (job #1895323) | Cod sursa (job #1132841) | Cod sursa (job #2175970)
#include <fstream>
#include <vector>
#include <cstring>
#define MAXN 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, arr[MAXN], t[MAXN], r[MAXN];
int binaryCeil(int end, int s);
void lsi();
int main()
{
fin >> n;
for (int i = 0; i < n; i++)
fin >> arr[i];
lsi();
return 0;
}
int binaryCeil(int end, int s)
{
int start = 0;
int m;
int len = end;
while (start <= end)
{
m = (start + end) / 2;
if (m < len && arr[t[m]] < s && s <= arr[t[m+1]])
{
return m+1;
}
else if (arr[t[m]] < s)
{
start = m + 1;
}
else
{
end = m - 1;
}
}
return -1;
}
void lsi()
{
memset(r, -1, MAXN);
t[0] = 0;
int len = 0;
for (int i = 1; i < n; i++)
{
if (arr[t[0]] > arr[i])
{
t[0] = i;
}
else if (arr[t[len]] < arr[i])
{
len++;
t[len] = i;
r[t[len]] = t[len-1];
}
else
{
int index = binaryCeil(len, arr[i]);
t[index] = i;
r[t[index]] = t[index-1];
}
}
int index = t[len];
string s = "";
fout << len+1 << "\n";
while (index != -1)
{
//fout << arr[index] << " ";
s = to_string(arr[index]) + " " + s;
index = r[index];
}
fout << s;
}