Pagini recente » Cod sursa (job #1577033) | Cod sursa (job #1678076) | Cod sursa (job #1694813) | Cod sursa (job #2751384) | Cod sursa (job #2190864)
//#include <fstream>
//#include <vector>
//#include <limits>
//
//std::ifstream f("scmax.in");
//std::ofstream g("scmax.out");
//
//constexpr int MAX = 100001;
//int n, length;
//
//std::vector<int> v(MAX);
//std::vector<int> q(MAX, std::numeric_limits<int>::max());
//std::vector<int> prevPos(MAX, -1);
//std::vector<int> pos(MAX);
//
//int Search(int n, int val)
//{
// /**************************/
// /* TODO: BINARY SEARCH */
// /**************************/
// for (int i = 0; i <= n; ++i) {
// if (q[i] >= val) {
// return i;
// }
// }
//}
//
//void Read()
//{
// f >> n;
//
// length = 0;
//
// for (int i = 0; i < n; ++i) {
// f >> v[i];
//
// int index = Search(length, v[i]);
//
// q[index] = v[i];
// pos[index] = i;
// prevPos[i] = (index == 0) ? -1 : pos[index - 1];
//
// if (index > length) {
// length = index;
// }
// }
//
// g << length + 1 << '\n';
//}
//
//void PrintSol(int i)
//{
// if (prevPos[i] == -1) {
// g << v[i] << ' ';
// }
// else {
// PrintSol(prevPos[i]);
// g << v[i] << ' ';
// }
//}
//
//int main(int, char *[])
//{
// Read();
// PrintSol(pos[length]);
//}
#include <iostream>
#include <fstream>
#define MAX 100002
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, previous[MAX], v[MAX], q[MAX], l;
void print(int pos)
{
if (pos)
{
print(previous[pos]);
g << v[pos] << ' ';
}
}
int main()
{
int st, dr, mid, pos;
f >> n;
f >> v[1];
q[1] = 1;
previous[1] = 0;
l = 1;
for (int i = 2; i <= n; ++i)
{
f >> v[i];
st = 0;
dr = l;
pos = -1;
while (st <= dr)
{
int mid = (st + dr) / 2;
if (v[q[mid]] >= v[i])
{
dr = mid - 1;
}
else
{
pos = mid;
st = mid + 1;
}
}
q[pos + 1] = i;
previous[i] = q[pos];
if (pos + 1 > l)
l = pos + 1;
}
g << l << '\n';
print(q[l]);
return 0;
}