Pagini recente » 8922938808215292 | Cod sursa (job #3208281) | Cod sursa (job #2665981) | Cod sursa (job #206867) | Cod sursa (job #2236080)
#include<cstdio>
#include<fstream>
#include<algorithm>
using namespace std;
FILE *f=fopen("subsir2.in","r");
ofstream g("subsir2.out");
int v[5002],l[5002],ant[5002],r[5002];
int n,len;
void scmax(int id)
{
int st,dr,mij,ans=0;
st=0;
dr=len;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[l[mij]]<v[id])
{
st=mij+1;
ans=mij;
}
else
dr=mij-1;
}
if(v[l[ans+1]]>v[id]||ans==len)
l[ans+1]=id;
len=max(len,ans+1);
ant[id]=l[ans];
}
void reconstituire()
{
int i=l[len],ll=len;
while(i!=0)
{
r[len--]=i;
i=ant[i];
}
for(i=1;i<=ll;i++)
g<<r[i]<<" ";
}
int main()
{
int i;
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
fscanf(f,"%d",&v[i]);
for(i=1;i<=n;i++)
scmax(i);
g<<len<<'\n';
reconstituire();
return 0;
}