Mai intai trebuie sa te autentifici.
Cod sursa(job #2647860)
Utilizator | Data | 6 septembrie 2020 19:39:31 | |
---|---|---|---|
Problema | Subsir crescator maximal | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.14 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, x, k, seqSize, v[100001], seq[100001], index[100001], ans[100001];
int valueSearch(int l, int r, int x)
{
int pos = -1;
while(l <= r)
{
int m = (l+r)/2;
if(seq[m] < x)
l = m+1;
else
{
pos = m;
r = m-1;
}
}
return pos;
}
int main()
{
fin>>n;
for(int i = 0; i < n; i++)
fin>>v[i];
seq[0] = v[0];
index[0] = 0;
for(int i = 1; i < n; i++)
{
if(v[i] > seq[seqSize])
{
seq[++seqSize] = v[i];
index[i] = seqSize;
}
else
{
int pos = valueSearch(0, seqSize, v[i]);
seq[pos] = v[i];
index[i] = pos;
}
}
fout<<seqSize+1<<'\n';
for(int i = n-1; i >= 0 && seqSize > -1; i--)
if(index[i] == seqSize)
{
ans[k++] = v[i];
seqSize--;
}
for(int i = k-1; i >= 0; i--)
fout<<ans[i]<<" ";
return 0;
}