Pagini recente » Cod sursa (job #1863871) | Borderou de evaluare (job #1875882) | Cod sursa (job #1876112) | Cod sursa (job #1877152)
#include <cstdio>
#include <vector>
#define NMAX 100005
#define INF (1<<30)+10
using namespace std;
FILE* fin = fopen("scmax.in","r");
FILE* fout = fopen("scmax.out","w");
int a[NMAX],best[NMAX], poz[NMAX],lg;
vector<int> sol;
//best[i] = cel mai mic element cu care se poate termina un subsir crescator de lg i
//poz[i] = pozitia pe care a fost plasat a[i] in best
int CautaBinar(int x)
{
int st, fi, mij;
st = 0; fi = lg+1;
while(fi-st>1)
{
mij = (st+fi)/2;
if(best[mij] >= x)
fi = mij;
else
st = mij;
}
return fi;
}
int main()
{
int N;
fscanf(fin,"%d",&N);
for(int i = 1; i<=N; i++)
{
fscanf(fin,"%d",&a[i]);
}
for(int i = 1; i<=N; i++)
{
if(a[i] > best[lg])
{
lg++;
best[lg] = a[i];
poz[i] = lg;
}
else
{
int pp = CautaBinar(a[i]);
best[pp] = a[i];
poz[i] = pp;
}
}
fprintf(fout,"%d\n",lg);
for(int i = N; i>=0 && lg;i--)
if(poz[i] == lg)
{
lg--;
sol.push_back(a[i]);
}
for(int i = sol.size()-1; i>=0;i--)
fprintf(fout,"%d ",sol[i]);
fprintf(fout,"\n");
return 0;
}