Pagini recente » Cod sursa (job #1978695) | Cod sursa (job #2772894) | Cod sursa (job #2712378) | Cod sursa (job #2814454) | Cod sursa (job #2723370)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <cstdlib>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100005;
const int INF = 2e9;
vector<int>sol;
int v[NMAX];
int best[NMAX];
int lg[NMAX];
int n, k = 0;
int caut_bin(int x,int y,int val)
{
int st = x;
int dr = y;
int med, ans = -1;
while(st <= dr)
{
med = (st + dr) / 2;
if(best[med] >= val)
{
ans = med;
dr = med-1;
}
else
st = med+1;
}
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(0);fout.tie(0);
fin >> n;
for(int i = 1 ; i <= n ; i++)
fin >> v[i];
lg[1] = 1;
best[++k] = v[1];
int ma = 0;
for(int i = 2 ; i <= n ; i++)
{
int pos = caut_bin(1,i-1,v[i]);
if(pos == -1)
{
best[++k] = v[i];
lg[i] = k;
ma = max(ma, k);
continue;
}
best[pos] = v[i];
lg[i] = pos;
ma = max(ma, pos);
}
int cnt = ma;
fout << ma << '\n';
for(int i = n ; i >= 1 ; i--)
if(lg[i] == cnt){
sol.push_back(v[i]);
cnt--;
}
reverse(sol.begin(),sol.end());
for(int e:sol)
fout << e << ' ';
return 0;
}