Mai intai trebuie sa te autentifici.
Cod sursa(job #2867624)
Utilizator | Data | 10 martie 2022 14:21:51 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.01 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, a[100005];
int cautare(const int v[], int st, int dr, int x)
{
int mij;
while(dr - st > 1){
mij = st + (dr - st) / 2;
if (v[mij] < x){
st = mij;
}else{
dr = mij;
}
}
return dr;
}
void Scmax(int N, int v[])
{
int D[N], p[N];
memset(D, 0, sizeof(D));
int k = 1, nr;
D[k] = v[1];
for (int i=2;i<=n;i++){
if (v[i] > D[k]){
D[++k] = v[i];
p[i] = k;
}else{
nr = cautare(D, 1, k, v[i]);
D[nr] = v[i];
p[i] = nr;
}
}
int sir[k+5];
int j=n;
for (int i=k;i>=1;--i){
while(p[j] != i)
j --;
sir[i] = j;
}
fout << k << '\n';
for (int i=1;i<=k;i++){
fout << v[sir[i]] << ' ';
}
}
int main() {
fin >> n;
for (int i=1;i<=n;i++){
fin >> a[i];
}
Scmax(n, a);
return 0;
}