Cod sursa(job #1896899)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 28 februarie 2017 23:13:03
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100005],L[100005],p[100005],mx,best[100005],poz,q,n,nr,i;
stack <int>S;
void CautBin(int st,int dr)
   {int mid=(st+dr)/2;
    if(st==dr)poz=mid;
    else {if(q<=a[L[mid]])CautBin(st,mid);
          else if(q>a[L[mid+1]])CautBin(mid+1,dr);
          else poz=mid;
         }
   }
int main()
{fin>>n;
 for(i=1;i<=n;i++)
    {fin>>a[i];
    }
 L[1]=1;
 L[0]=0;
 nr=1;
 for(i=2;i<=n;i++)
    {q=a[i];
     CautBin(0,nr);
      if(a[L[poz]]>q)poz--;
     L[poz+1]=i;
     if(poz+1>nr)nr=poz+1;
     p[i]=L[poz];
     best[i]=poz+1;
    }
 fout<<nr<<"\n";
 for(i=n;i>=1;i--)
    {if(best[i]==nr){while(i!=0){S.push(i);
                     i=p[i];}
                     break;
                    }
    }
 while(!S.empty())
      {fout<<a[S.top()]<<" ";
        S.pop();
      }
}