Pagini recente » Cod sursa (job #955817) | Cod sursa (job #1949871) | Cod sursa (job #1047588) | Cod sursa (job #356539) | Cod sursa (job #2857252)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
/*******************************/
// INPUT / OUTPUT
ifstream f("scmax.in");
ofstream g("scmax.out");
/*******************************/
/// GLOBAL DECLARATIONS
int N;
int maxLen = -1, lastI;
int v[NMAX], secv[NMAX], pre[NMAX];
vector <int> sol;
/*******************************/
/// FUNCTIONS
void ReadInput();
void Solution();
void Output();
/*******************************/
///-------------------------------------
inline void ReadInput()
{
f >> N;
for (int i = 1 ; i <= N ; ++ i)
{
f >> v[i];
}
}
///-------------------------------------
int Find(int end)
{
int left = 1, right = maxLen;
int pos = 0;
while (left <= right)
{
int mid = (left + right) / 2;
if (secv[mid] != 0)
{
if (v[secv[mid]] < end)
{
pos = mid;
left = mid + 1;
}
else
{
right = mid - 1;
}
}
else
{
right = mid - 1;
}
}
return pos;
}
///-------------------------------------
inline void Solution()
{
int seqLen;
for (int i = 1 ; i <= N ; ++ i)
{
seqLen = Find(v[i]);
if (secv[seqLen + 1] == 0)
{
pre[i] = secv[seqLen];
secv[seqLen + 1] = i;
if (maxLen < seqLen + 1)
{
maxLen = seqLen + 1;
lastI = i;
}
}
else
{
if (v[secv[seqLen + 1]] > v[i])
{
pre[i] = secv[seqLen];
secv[seqLen + 1] = i;
if (maxLen < seqLen + 1)
{
maxLen = seqLen + 1;
lastI = i;
}
}
}
}
}
///-------------------------------------
inline void Output()
{
g << maxLen << "\n";
int i = lastI;
while (i != 0)
{
sol.push_back(v[i]);
i = pre[i];
}
reverse(sol.begin(), sol.end());
for (auto num: sol) g << num << " ";
}
///-------------------------------------
int main()
{
ReadInput();
Solution();
Output();
return 0;
}