Pagini recente » Cod sursa (job #162832) | Cod sursa (job #2197784) | Cod sursa (job #2492589) | Cod sursa (job #245552) | Cod sursa (job #2334525)
#include <fstream>
#include <limits.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int n, i, j, m, maxim, poz, st, dr, mid, v[100005], d[100005], tata[100005];
inline int print (int a){
if (a){
print (tata[a]);
fout << v[a] << " ";
}
}
int main()
{
fin >> n;
for (i=1; i<=n; i++){
fin >> v[i];
}
m = 1;
d[1] = 1; // l[i] = pozitia celei mai mici valoari in care se poate termina un sir de lungime i, folosind elementele deja parcurse
for (i=2; i<=n; i++){
// caut binar pozitia ultimei valori l[poz] din L pentru care v[i] > v[l[poz]]
// st ramane pe pozitia primei valori mai mari sau egale cu ce caut
// dr ramane pe pozitia ultimei valori strict mai mici decat ce caut
st = 1, dr = m;
while (st <= dr){
mid = st + (dr - st)/2;
if (v[d[mid]] >= v[i]){
dr = mid - 1;
}
else{
st = mid + 1;
}
}
if (st > m){
m++;
d[m] = i;
}
else{
d[st] = i;
}
tata[i] = d[st-1]; // vector de tati
}
fout << m << "\n";
print (d[m]);
return 0;
}
/** recapitulare **/
// O(N*logN)