Pagini recente » Borderou de evaluare (job #585890) | Cod sursa (job #2990276) | Cod sursa (job #1266017) | Borderou de evaluare (job #1566146) | Cod sursa (job #2210389)
#include <iostream>
#include <fstream>
using namespace std;
int N,a[100005],sol[100005],viz[100005],top;
ofstream fout("scmax.out");
void Citire()
{
int i;
ifstream fin("scmax.in");
fin>>N;
for(i=1;i<=N;i++)
fin>>a[i];
fin.close();
}
void AfisA();
int CautBin(int x)
{
int st=1;
int dr=top;
int mid;
while(st<=dr)
{
mid=(st+dr)/2;
if(a[sol[mid]]>=x && a[sol[mid-1]]<x)
break;
else
{
if(a[sol[mid]]>=x) dr=mid-1;
else
{
st=mid+1;
}
}
}
//cout<<a[mid+1]<<"\n";
return mid;
}
void Solutie()
{
int i,aux;
sol[++top]=1;
for(i=2;i<=N;i++)
{
if(a[i]>a[sol[top]])
{
viz[i]=sol[top];
sol[++top]=i;
}
else
{
aux=CautBin(a[i]);
/*cout<<aux<<"\n";
AfisA();*/
viz[i]=sol[aux-1];
sol[aux]=i;
}
//AfisA();
}
}
void Recv(int x)
{
if(viz[x]!=0) Recv(viz[x]);
fout<<a[x]<<" ";
}
void Afisare()
{
fout<<top<<"\n";
Recv(sol[top]);
}
void AfisA()
{
for(int i=1;i<=N;i++)
cout<<viz[i]<<" ";
cout<<"\n";
for(int i=1;i<=N;i++)
cout<<sol[i]<<" ";
cout<<"\n";
}
int main()
{
Citire();
Solutie();
Afisare();
//AfisA();
fout.close();
}