Pagini recente » Istoria paginii utilizator/jaguarb28 | Diferente pentru autumn-warmup-2007/solutii/runda-3 intre reviziile 40 si 41 | Monitorul de evaluare | Diferente pentru probleme-de-taietura intre reviziile 82 si 81 | Cod sursa (job #2008088)
#include<fstream>
using namespace std;
ifstream fi("scmax.in");
ofstream fo("scmax.out");
int n,i,j,a[100001],b[100001],poz[100001],sol[100001],S,D,k,P;
int cautare (int S,int D,int x,int a[])
{
int M;
while(S<=D)
{ M=(S+D)/2;
if(a[M] < x) S=M+1;
else D=M-1;
}
return S;
}
int main()
{
fi>>n;
for(i=1; i<=n; i++) fi>>a[i];
for(i=1; i<=n; i++)
{
P=cautare(1,k,a[i],b); //cautam binar elementul a[i] in sirul b in intervalul[1,k]
if (P>k)k++;
b[P]=a[i];
poz[i]=P;
}
for(i=n; i>=1&&k; i--)
if(poz[i]==k) {sol[++j]=a[i];
k--;
}
for(fo<<j<<'\n'; j; fo<<sol[j--]<<" ");
}