Cod sursa(job #1792381)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 30 octombrie 2016 13:35:21
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector <int> v[100000];
void adaug(int x)
{
    int i;
    if(v[v[0][0]][v[0][0]-1]<x && v[v[0][0]][v[0][0]-2]>x)
    {
        for(i=0;i<v[0][0];i++)
            v[v[0][0]+1].push_back(v[v[0][0]][i]);
        v[0][0]++;
        v[v[0][0]].push_back(x);
        return ;
    }

    for(i=v[0][0];i>1;i--)
    {
        if(x<v[i][i-1] && x>v[i][i-2])
        {
            v[i][i-1]=x;
            return ;
        }
        else
        {
            if(x>v[i][i-1])
            {
                if(i!=v[0][0])
                {
                    if(x<v[i+1][i])
                    {
                        v[i+1].clear();
                        for(int j=0;j<i;j++)
                            v[i+1].push_back(v[i][j]);
                        v[i+1].push_back(x);
                        return ;
                    }
                }
                else
                {
                        for(int j=0;j<i;j++)
                            v[i+1].push_back(v[i][j]);
                        v[0][0]++;
                        v[i+1].push_back(x);
                        return ;
                }
            }
        }
    }
    if(v[1][0]>x)
    {
        v[1][0]=x;
    }
    else
    {
        if(x<v[2][1] && x>v[1][0])
        {
            v[2][0]=v[1][0];v[2][1]=x;
        }
    }
}
int main()
{
    int n,x,i;
    fin>>n;
    fin>>x;
    v[1].push_back(x);
    v[0].push_back(1);
    for(i=2;i<=n;i++)
    {
        fin>>x;
        adaug(x);
    }
    fout<<v[0][0]<<'\n';
    for(i=0;i<v[0][0];i++)
        fout<<v[v[0][0]][i]<<' ';
    return 0;
}