Cod sursa(job #2056135)

Utilizator ioanalexandraIoan Alexandra ioanalexandra Data 4 noiembrie 2017 09:21:01
Problema Subsir 2 Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f ("subsir2.in");
ofstream g ("subsir2.out");
int n,a[100001],b[100001],lmax,i,l[100001],k;
void citire()
{
    f>>n;
    for(i=1; i<=n; i++)
        f>>a[i],b[i]=1000000001;
}
int caut(int x)
{
    int mij,p=1,u=n;
    while(p<=u)
    {
        mij=(p+u)/2;
        if(b[mij]<=x) p=mij+1;
        else u=mij-1;
    }
    return u;
}
void solve()
{
    int i,p;
    for(i=1; i<=n; i++)
    {
        p=caut(a[i]);
        if(a[i]<b[p+1]) {b[p+1]=a[i]; l[i]=p+1;
        }
        if(p+1>=lmax) {lmax=p+1; k=i;}
    }
}
void drum(int k)
{
    int j;
    for(j=k;j>=1 && lmax; j--)
        if(l[j]==lmax && a[j]<=a[k])
    {
        k=j;
        lmax--;
        drum(k);
        g<<a[k]<<" ";
    }
}
int main()
{
    citire();
    solve();
    g<<lmax<<'\n';
    drum(lmax);
    return 0;
}