Pagini recente » Cod sursa (job #761104) | Rezultatele filtrării | Rezultatele filtrării | Rezultatele filtrării | Cod sursa (job #3301945)
#include <bits/stdc++.h>
using namespace std;
const int inf=INT_MAX;
int dp[100005]; ///dp[i] = valoarea minima care vine pe pozitia i pt un subsir maximal s crescator
int v[100005], ind[100005], precedent[100005]; ///cu ind marcam ce numar apare pe fiecare pozitie a noului sir
///precedent arata numarul cu o pozitie mai mica la momentul in care numarul e introdus in sir
vector<int> rasp;
int main()
{
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>v[i];
v[0]=-inf;
v[n+1]=inf;
for(int i=1; i<=n; i++)
ind[i]=n+1;
int maxim=0;
for(int i=1; i<=n; i++)
{
int poz=0;
for(int k=20; k>=0; k--)
{
if(poz+(1<<k)<=n && v[i]>v[ind[poz+(1<<k)]]) ///cautam binar pe biti cea mai mare poz din sirul format care e mai mica ca v[i]
poz+=(1<<k);
}
poz++; ///v[i] e introdus pe pozitia poz+1
ind[poz]=i;
maxim=max(maxim, poz);
precedent[i]=ind[poz-1];
}
cout<<maxim<<'\n';
int pozcurenta=ind[maxim];
for(int i=1; i<=maxim; i++)
rasp.push_back(v[pozcurenta]), pozcurenta=precedent[pozcurenta];
reverse(rasp.begin(), rasp.end());
for(int i=0; i<rasp.size(); i++)
cout<<rasp[i]<<" ";
return 0;
}