Pagini recente » Cod sursa (job #2332219) | Cod sursa (job #3159844) | Cod sursa (job #2061936) | Cod sursa (job #1077482) | Cod sursa (job #1997516)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int get_poz(int best, int i, vector< int > &v, vector< int > &partial) {
int st = 1;
int dr = best;
int mid;
while(st <= dr) {
mid = (st + dr) >> 1;
if(v[i] <= v[partial[mid]] and v[partial[mid - 1]] < v[i])
return mid;
else if(v[i] > v[partial[mid]])
st = mid + 1;
else if(v[i] <= v[partial[mid]] and v[partial[mid - 1]] > v[i])
dr = mid - 1;
}
}
int main() {
int n;
cin >> n;
vector< int > v(n + 1);
vector< int > partial(n + 1);
vector< int > prev(n + 1);
int best = 0;
v[0] = -1;
partial[0] = 0;
prev[0] = -1;
for(int i = 1; i <= n; i ++) {
cin >> v[i];
if(v[i] > v[partial[best]]) {
best ++;
partial[best] = i;
prev[best] = i;
}
else if(v[i] == v[partial[best]]) {
partial[best] = i;
prev[best] = i;
}
else {
int k = get_poz(best, i, v, partial);
partial[k] = i;
if(prev[k - 1] < i)
if(k + 1 <= best) {
if(i < k + 1)
prev[k] = 1;
}
else
prev[k] = i;
}
}
cout << best << '\n';
for(int i = 1; i <= best; i ++)
cout << v[prev[i]] << ' ';
cout << '\n';
}