Pagini recente » Cod sursa (job #1498452) | Cod sursa (job #1425288) | Cod sursa (job #762462) | Cod sursa (job #765049) | Cod sursa (job #3152472)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int main()
{
int n;
fin >> n;
vector<int>v(n + 1);
vector<int>cap(n + 1);
vector<int>poz(n + 1);
for (int i = 1; i <= n; ++i)
{
fin >> v[i];
}
int lung = 0;
for(int i = 1; i <= n; i++)
{
int left = 1, right = lung, mid;
while(left <= right)
{
mid = (left + right) / 2;
if(cap[mid] < v[i])
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
cap[left] = v[i];
poz[i] = left;
lung = max(left, lung);
}
// for(int i = 1; i <= n; i++)
// {
// fout << cap[i] << " ";
// }
// fout << "\n";
// for(int i = 1; i <= n; i++)
// {
// fout << poz[i] << " ";
// }
// fout << "\n";
vector<int>sol;
fout << lung << "\n";
for(int i = n; i >= 1; i--)
{
if(poz[i] == lung)
{
sol.push_back(v[i]);
lung--;
}
}
for(int i = sol.size() - 1; i >= 0; i--)
{
fout << sol[i] << " ";
}
return 0;
}