Cod sursa(job #1652634)

Utilizator adystar00Bunea Andrei adystar00 Data 15 martie 2016 10:49:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
using namespace std;
int v[100001],p[100001],q[100001],ans[100001];
int main()
{
    ifstream fin ("scmax.in");
    ofstream fout ("scmax.out");
    int i,n,sf,vf=0,st,dr,mij,sol;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
        sf=1;
        q[1]=v[1];
        p[1]=1;
    for(i=2;i<=n;i++)
    {
        st=1;
        dr=sf;
        sol=0;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            //cout<<st<<" "<<dr<<" "<<mij<<" "<<q[mij]<<" "<<i<<" "<<v[i]<<" "<<sol<<"\n";
            if(q[mij]>=v[i]){
                dr=mij-1;
                sol=mij;
            }
            else
                st=mij+1;
                //cout<<st<<" "<<dr<<" "<<mij<<"\n";
        }
        //cout<<v[i]<<" "<<sol<<"\n";
        if(sol!=0){
            p[i]=sol;
           // cout<<p[i]<<" "<<sol<<" "<<v[i]<<"\n";
            q[sol]=v[i];
        }
        else
        {
            sf++;
            q[sf]=v[i];
            p[i]=sf;
        }
    }
   //for(i=sf;i>0;i--)
       // cout<<q[i]<<" ";
      // for(i=1;i<=n;i++)
       //cout<<v[i]<<" "<<p[i]<<"\n";
    for(i=n;i>0;i--)
    {
        if(p[i]==sf)
        {
            vf++;
            ans[vf]=v[i];
            sf--;
        }
        //cout<<i<<" ";
    }
    fout<<vf<<"\n";
    for(i=vf;i>0;i--)
        fout<<ans[i]<<" ";
    return 0;
}