Pagini recente » Cod sursa (job #1661303) | Cod sursa (job #539219) | Cod sursa (job #1925107) | Cod sursa (job #2461685) | Cod sursa (job #1997812)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int find_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]]) {
if(v[i] > v[partial[mid - 1]]) {
if(mid + 1 > best)
return mid;
else if(v[i] < v[partial[mid + 1]])
return mid;
}
dr = mid - 1;
}
else
st = mid + 1;
}
}
void remake(int poz, int len_max, vector< int > &v, vector< int > &partial, vector< int > &prev) {
if(len_max == 0)
return;
else {
remake(prev[poz], len_max - 1, v, partial, prev);
cout << v[prev[poz]] << ' ';
}
}
int main() {
int n;
cin >> n;
vector< int > v(n + 1);
vector< int > partial(n + 1);
vector< int > prev(n + 2);
int len_max = 0;
partial[0] = 0;
v[0] = -1;
for(int i = 1; i <= n; i ++) {
cin >> v[i];
if(v[i] > v[partial[len_max]]) {
len_max ++;
partial[len_max] = i;
prev[i] = partial[len_max - 1];
}
else if(v[i] == v[partial[len_max]]) {
int aux = prev[partial[len_max]];
partial[len_max] = i;
prev[partial[len_max]] = aux;
}
else {
int k = find_poz(len_max, i, v, partial);
int aux = prev[partial[k]];
partial[k] = i;
prev[partial[k]] = aux;
}
}
cout << len_max << '\n';
prev[n + 1] = partial[len_max];
remake(n + 1, len_max, v, partial, prev);
}