Pagini recente » Cod sursa (job #2686349) | Cod sursa (job #3275882) | Cod sursa (job #874270) | Cod sursa (job #1910885) | Cod sursa (job #2511288)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[100005], n;
vector <int> p, q;
void citire() {
fin >> n;
for(int i = 0; i < n; i++)
fin >> v[i];
}
int cb(int st, int dr, int x) {
if(!q.size() || x > q[q.size()-1]) {
q.push_back(x);
return q.size()-1;
}
if(q[0]>=x) {
q[0] = x;
return 0;
}
/*while(dr-st-1 > 0) {
int m = (st+dr)/2;
if(q[m] < x) st = m+1;
else if(q[m] > x) dr = m-1;
else {
q[m] = x;
return m;
}
}*/
while(dr-st-1 > 0) {
int m = (st+dr)/2;
if(q[m] < x) st = m;
else dr = m;
}
q[dr] = x;
return dr;
}
void solve() {
for(int i = 0; i < n; i++) {
int poz = cb(0, q.size()-1, v[i]);
///cout<< "cb " << v[i] << "="<< poz << '\n';
p.push_back(poz);
}
}
void afis() {
fout << q.size() << '\n';
int s[100005], k = p.size()-1;
for(int i = q.size()-1; i >= 0; i--) {
while(p[k] != i)
k--;
s[i] = v[k];
}
for(int i = 0; i < q.size(); i++)
fout << s[i] << ' ';
}
int main() {
citire();
solve();
afis();
}