Pagini recente » Cod sursa (job #342033) | Cod sursa (job #197905) | Cod sursa (job #34522) | Cod sursa (job #2710241) | Cod sursa (job #2538601)
#include <fstream>
#include <vector>
std::ifstream f("input.in");
std::ofstream g("output.out");
const int NMAX = 100'005;
int n,len,v[NMAX],t[NMAX],l[NMAX],last;
std::vector<int>sol;
// v - arrayul citit de la tastatura
// t - vectorul de tati
// l - arrayul de dinamica
int search(int left,int right,int x){
while(left <= right){
int mid = (left + right) / 2;
if(mid + 1 <= len && v[l[mid]] < x && x <= v[l[mid + 1]])
return mid + 1;
if(v[l[mid]] < x)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
void reconst(int index){
if(t[index] != -1)
reconst(t[index]);
else
last = index;
sol.push_back(v[index]);
}
int main(){
f >> n;
for(int i = 0;i < n;++i){
f >> v[i];
t[i] = -1;
}
len = 0;
l[0] = 0;
for(int i = 1;i < n;++i){
if(v[l[0]] > v[i]){
l[0] = i;
continue;
}
if(v[l[len]] < v[i]){
len++;
l[len] = i;
t[l[len]] = l[len - 1];
continue;
}
int index = search(0,len,v[i]);
l[index] = i;
t[l[index]] = t[index - 1];
}
g << len + 1 << '\n';
reconst(l[len]);
int e = v[last];
while(last--){
if(v[last] < e){
g << v[last] << ' ';
break;
}
e--;
}
for(int i = sol.size() - 1;i >= 0;--i)
g << sol[i] << ' ';
return 0;
}