Cod sursa(job #2275035)

Utilizator RedXtreme45Catalin RedXtreme45 Data 2 noiembrie 2018 19:45:38
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda alexei1 Marime 2.08 kb
#include <fstream>

using namespace std;
int v[100002],q[100002],p[100002];

int main()
{
    int n,i,j;
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin>>n;
    for (i=1; i<=n; i++)
    {
        fin>>v[i];
    }
    q[1]=v[1];
    p[1]=1;
    int u=1;
    for (i=2; i<=n; i++)
    {
        if (u==1)
        {
            if (v[i]<=q[u])
            {
                q[u]=v[i];
                p[i]=1;
            }
            if (v[i]>q[u])
            {
                u++;
                q[u]=v[i];
                p[i]=u;
            }
        }
        else
        {
            if (v[i]<=q[u] && v[i]>=q[1])
            {
                int x,OK=1,p1=1,d=2;
                while (p1<u && OK==1)
                {
                    int m=(p1+u)/2;
                    if (v[i]>q[m])
                    {
                        p1=m+1;
                        d=-1;
                    }
                    if (v[i]<q[m])
                    {
                        u=m-1;
                        d=1;
                    }
                    if (v[i]==q[m])
                    {
                        x=m;
                        OK=-1;
                    }
                }
                if (OK!=-1)
                {
                    if (d==1)
                    {
                        x=u+1;
                    }
                    if (d==-1)
                    {
                        x=p1;
                    }
                }
                q[x]=v[i];
                p[i]=x;
            }
            if (v[i]>q[u])
            {
                u++;
                q[u]=v[i];
                p[i]=u;
            }
            if (v[i]<q[1])
            {
                q[1]=v[i];
                p[i]=1;
            }

        }
    }
    fout<<u<<"\n";
    int o=u;
    for (i=n; i>=1; i--)
    {
        if (p[i]==u)
        {
            q[u]=i;
            u--;
        }
    }
    for (i=1; i<=o; i++)
        fout<<v[q[i]]<<" ";
    return 0;
}