Nu aveti permisiuni pentru a descarca fisierul grader_test10.ok
Cod sursa(job #1784940)
Utilizator | Data | 20 octombrie 2016 18:03:32 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 55 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.74 kb |
#include <iostream>
using namespace std;
int N,i;
int a[100015], s[100015];
int P[100015],M[100015],L;
void afis(int o) {
if(o > 0)
afis(P[o]);
cout << a[o] << " ";
}
int bs(int nr) {
int lo = 1,hi = L;
while (lo <= hi){
int mid = (lo + hi) / 2;
if(a[M[mid]] < nr)
lo = mid + 1;
else
hi = mid - 1;
}
return lo;
}
void LIS() {
for(i = 0; i < N; i++) {
int newL = bs(a[i]);
P[i] = M[newL - 1];
M[newL] = i;
if (newL > L)
L = newL;
}
cout << L << '\n';
afis(M[L]);
}
int main() {
// freopen("f.txt","r",stdin);//
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
cin >> N;
for(i = 0; i < N; i++)
cin >> a[i];
LIS();
return 0;
}