Pagini recente » Cod sursa (job #3121244) | Cod sursa (job #3038542) | Cod sursa (job #1454218) | Cod sursa (job #1554538) | Cod sursa (job #2304583)
#include <fstream>
#define DIM 100010
using namespace std;
int V[DIM], T[DIM], L[DIM];
///L[i] = indicele din V al celei mai mici valori in care se poate termina un sir de lungime i (de fapt L[i] = poZitia din V a unei astfel de valori)
/// folosind elementele deja parcurse
int n, m, i, p, u, mid;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
void sol(int i) {
if (i) {
sol(T[i]);
fout<<V[i]<<" ";
}
}
int main() {
fin>>n;
for (i=1;i<=n;i++)
fin>>V[i];
m = 1;
L[1] = 1;
for (i=2;i<=n;i++) {
p = 1; ///caut pozitia ultimei valori L[poz] din L pentru care V[i] > V[ L[poz] ]
u = m;
while (p<=u) {
mid = p+(u-p)/2;
if (V[ L[mid] ] >= V[i])
u = mid - 1;
else
p = mid + 1;
}
/// p ramane pe pozitia primei valori mai mari sau egale cu ce caut
/// u ramane pe pozitia ultimei valori strict mai mici decat ce caut
if (p > m) {
m++;
L[m] = i;
T[i] = L[p-1];
} else {
///if (V[ L[p] ] > V[i]) {
L[p] = i;
T[i] = L[p-1]; /// extind sirul terminat pe pozitia p-1(u)
//}
}
}
fout<<m<<"\n";
sol(L[m]);/// in T este un vector de tati pentru indici din V
return 0;
}