Pagini recente » Borderou de evaluare (job #2888049) | Clasamentul arhivei de probleme | Borderou de evaluare (job #1869884) | tema | Cod sursa (job #1974108)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout("scmax.out");
vector<int> v,q,p;
int n;
int caut_bin (int x){
int hi= q.size()-1, lo= -1 ,mid;
while(hi-lo > 1){
mid = lo + (hi-lo)/2;
if(q[mid] >= x)
hi = mid;
else lo = mid;
}
if(q[hi] < x)
return hi + 1;
return lo + 1;
}
int main()
{
fin >> n;
p.push_back(-100);
q.push_back(-100);
v.push_back(-100);
// q = {0,2,3,7};
// len = 3;
//
// cout << caut_bin(3);
for(int i = 1; i<=n; ++i){
int nr; fin >> nr; v.push_back(nr);
if(q.size()-1 == 0){
q.push_back(nr);
p.push_back(1);
}
else{
int poz = caut_bin(nr);
p.push_back(poz);
if(poz > q.size()-1)
q.push_back(nr);
else
q[poz] = nr;
}
}
int len = q.size() - 1;
fout << len << "\n";
vector<int> ans;
for(int i = p.size()-1; i>=1; --i){
if(len == p[i]){
ans.push_back(v[i]);
len --;
}
}
for(int i = ans.size()-1; i>=0; --i)
fout << ans[i] << " ";
return 0;
}