Pagini recente » Cod sursa (job #2603700) | Cod sursa (job #2863523) | Cod sursa (job #499921) | Cod sursa (job #467272) | Cod sursa (job #1975342)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int binsearch(int v[], vector<int> &T, int l, int r, int val)
{
int mid;
while (l < r)
{
mid = (l + r) / 2;
if (v[T[mid]] < val)
l = mid + 1;
else
r = mid - 1;
}
return mid;
}
void LIS(int v[], int n)
{
vector <int> lowest(n, 0);
vector <int> prevIndex(n, -1);
int len = 1;
for (int i = 1; i < n; i++)
{
//if current element is lower than the lowest
if (v[i] < v[lowest[0]])
lowest[0] = i;
//if current element is bigger than the biggest add it to subsequence
else if (v[i] > v[lowest[len - 1]])
{
prevIndex[i] = lowest[len - 1];
lowest[len++] = i;
}
else
{
//search the lowest element that is bigger than v[i](current el) and change it with v[i]
int pos = binsearch(v, lowest, 0, len - 1, v[i]);
lowest[pos] = i;
prevIndex[i] = prevIndex[pos];
}
}
g << len << endl;
vector <int> reverse;
for (int i = lowest[len - 1]; i >= 0; i = prevIndex[i])
reverse.push_back(v[i]);
//g << v[i] << " ";
for (int i = len - 1; i >= 0; i--)
g << v[i] << " ";
}
int main()
{
int n;
int v[100000];
f >> n;
for (int i = 0; i < n; i++)
{
f >> v[i];
}
LIS(v, n);
char t;
cin >> t;
}