Pagini recente » Cod sursa (job #1745538) | Cod sursa (job #1698465) | Cod sursa (job #837006) | Cod sursa (job #171261) | Cod sursa (job #1809253)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, i, j, d[100001], k, v[100001], t[100010];
void solutie(int u) {
if (u) {
solutie(t[u]);
fout<<v[ u ]<<" ";
}
}
int main(){
// 6 11 3 2 5 9 7 8 1 4 5
// 1 2 1 1 2 3 3 4 1 2 3
// 1 4 7 8
// D[k] = valoarea minima ce ppoate fi la finalul unui subsir crescator de lungime k
// dupa ce am paercurs primele i numere din sirul meu
// DE FAPT TIN IN D[i] INDICELE DIN v al VALORII DEFINITE MAI SUS
fin>>n;
for (i=1;i<=n;i++) {
fin>>v[i];
}
d[1] = 1;
k = 1;
int st, dr;
for (i=2;i<=n;i++) {
// caut prima pozitie >=v[i] si pe aceea o voi inlocui
st = 1;
dr = k;
while (st <= dr) {
int mid = (st + dr)/2;
if (v[ d[mid] ] >= v[i])
dr = mid - 1;
else
st = mid + 1;
}
if (st > k) //(st == k+1) {
k++;
d[st] = i;
t[i] = d[st-1];
}
fout<<k<<"\n";
// in t[i] memoram, in momentul in care punem indicele i in D, valoarea indicelui pus in d pe pozitia
// anterioara celei pe care l-am pus pe i, pozitie din acest momment
solutie(d[k]);
return 0;
}