Pagini recente » Cod sursa (job #2131588) | Cod sursa (job #533553) | Cod sursa (job #1169282) | Cod sursa (job #2653495) | Cod sursa (job #2749505)
#include <fstream>
#define DMAX 100005
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int PD(long long int s[DMAX],int n,int M[],int P[])
{
int maxi=0,gasit,st,dr,mij;
for(int i=0;i<=n;i++)
M[i]=0;
s[0]=2000000001;
for(int i=1;i<=n;i++)
{
//cautare binara
gasit=0;
st=0;
dr=maxi+1;
while(dr-st>1)
{
mij=(st+dr)/2;
if(s[M[mij]]<s[i])
st=mij;
else
dr=mij;
}
if(s[M[st]]<s[i])
{
gasit=1;
if(s[i]<s[M[st+1]])
{
M[st+1]=i;
P[i]=M[st];
}
if(st+1>maxi)
maxi=st+1;
}
if(gasit==0)
{
if(s[i]<s[M[1]])
{
M[1]=i;
P[i]=-1;
}
if(maxi==0)
maxi=1;
}
}
return maxi;
}
long long int finalvec[DMAX];
void ReconstituireSolutie(long long int s[],int n,int M[],int P[],int sol)
{
int poz=M[sol];
int solvechi=sol;
sol--;
while(poz!=-1)
{
finalvec[sol]=s[poz];
poz=P[poz];
sol--;
}
for(int i=0;i<solvechi;i++)
fout<<finalvec[i]<<' ';
}
int main()
{
//vectorul s contine -1 pe pozitia 0 fiindca il consider indexat de la pozitia 1
int M[DMAX],P[DMAX], n;
long long int s[DMAX];
fin>>n;
for(int i=1;i<=n;i++)
fin>>s[i];
int sol=PD(s,n,M,P);
fout<<sol<<'\n';
ReconstituireSolutie(s,n,M,P,sol);
return 0;
}