Cod sursa(job #1369471)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 3 martie 2015 08:39:07
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
 #include<fstream>
 using namespace std;
 #define MAX 100001
 ifstream fin("scmax.in");
 ofstream fout("scmax.out");
 int a[MAX],b[MAX],poz[MAX];
 int n,m;

 void citire()
 {
 int i;
 fin>>n;
 for(i=1;i<=n;i++)
fin>>a[i];
 }
 int caut(int p, int u, int x)
 {
 int m;
 while(p<=u)
 {
 m=p+(u-p)/2;
 if(x<a[b[m]])
 p=m+1;
 else
 u=m-1;
 }
 return p;
}

 void subsir()
 {
 int i,k;
 a[0]=1234567890;
 for(i=n;i>=1;i--)
 {
 poz[i]=0;
 k=caut(1,m,a[i]);
 if(k>m)
 {
 poz[i]=b[k-1];
 m=k;
 b[k]=i;
}
 else
 {
 poz[i]=b[k-1];
 if(a[b[k]]<a[i])
 b[k]=i;
 }
}
 }

 void tipar()
{
 int i;
 fout<<m<<'\n';
 for(i=b[m];i>0;i=poz[i])
 {
 fout<<a[i]<<' ';
 }
 }
 int main()
 {
 citire();
 subsir();
 tipar();
 fin.close();
 }