Pagini recente » Cod sursa (job #2032328) | Cod sursa (job #2357278) | Cod sursa (job #656238) | Cod sursa (job #1620165) | Cod sursa (job #1570996)
#include <cstdio>
#define MAX 5000
using namespace std;
int v[MAX+1], best[MAX+1], last[MAX+1], nr, poz[MAX+1], vc[MAX+1];
int caut(int x)
{
int st=0, dr=nr, mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[poz[mij]]<x&&v[poz[mij+1]]>=x) return mij;
if(x>v[poz[mij]]) st=mij+1;
else dr=mij-1;
}
return nr;
}
void afisare(int poz)
{
if(last[poz]!=0)
afisare(last[poz]);
printf("%d ", poz);
}
int main()
{
freopen("subsir2.in", "r",stdin);
freopen("subsir2.out", "w", stdout);
int i, min, n, p;
scanf("%d", &n);
for(i=1;i<=n;i++)
scanf("%d", &v[i]);
nr=poz[1]=best[1]=1;
for(i=2;i<=n;i++)
{
p=caut(v[i]);
best[i]=p+1;
last[i]=poz[p];
vc[poz[p]]=1;
poz[p+1]=i;
if(nr<p+1)
nr=p+1;
}
min=n+1;
int pozmax;
for(i=n;i>=1;i--)
if(min>best[i]&&vc[i]==0)
{
min=best[i];
pozmax=i;
}
printf("%d\n", min);
afisare(pozmax);
return 0;
}