Pagini recente » Cod sursa (job #3333316) | Cod sursa (job #830937) | Cod sursa (job #561678) | Cod sursa (job #881265) | Cod sursa (job #3308710)
#include <iostream>
#include <fstream>
using namespace std;
const int Nmax = 100005;
int n, v[Nmax], dp[Nmax], minVal[Nmax], len, sol[Nmax];
// dp[i] = lungimea scmax care se termina pe pozitia i
// minVal[l] = valoarea minima a unei secvente crescatoare de lungime l
int binSearch(int val){
int st = 1, dr = len;
int rez = 0;
while(st <= dr){
int mij = (st + dr) / 2;
if(minVal[mij] >= val){
rez = mij;
dr = mij-1;
}
else{
st = mij+1;
}
}
return rez;
}
int main(){
ifstream fin("scmax.in");
ofstream fout("scmax.out");
fin >> n;
for(int i = 1; i <= n; i++){
fin >> v[i];
}
dp[1] = 1;
minVal[1] = v[1];
len = 1; // lungimea lui len[]
for(int i = 2; i <= n; i++){
if(v[i] > minVal[len]){
minVal[++len] = v[i];
dp[i] = len;
}
else{
int poz = binSearch(v[i]); // poz primului elem >= v[i] din vectorul minVal
minVal[poz] = v[i];
dp[i] = poz;
}
}
fout << len << "\n";
int i = len;
int j = n;
while(i > 0 && j > 0){
if(dp[j] == i){
sol[i--] = v[j];
}
j--;
}
for(int i = 1; i <= len; i++){
fout << sol[i] << " ";
}
return 0;
}