Pagini recente » Cod sursa (job #1564864) | Cod sursa (job #2952330) | Cod sursa (job #136051) | Cod sursa (job #2180261) | Cod sursa (job #2236718)
#include <vector>
#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
int v[Nmax],index[Nmax],pred[Nmax];
int size,n;
void citire()
{
fscanf(f,"%d",&n);
for(int i=1;i<=n;i++){
fscanf(f,"%d",&v[i]);
}
}
int cb(int x)
{
int r=0,pas=1<<20;
while(pas)
{
if(r+pas<=size)
if(v[index[r+pas]]<x)
r+=pas;
pas/=2;
}
return r+1;
}
void rezolva()
{
size = 0;
for(int i=1;i<=n;i++)
{
if(v[index[size]]<v[i])
{
pred[i]=index[size];
index[++size]=i;
}
else
{
int poz = cb(v[i]);
pred[i] = index[poz-1];
index[poz] = i;
}
}
}
int main()
{
citire();
rezolva();
fprintf(g,"%d\n",size);
vector<int> ans;
int x=index[size];
while(x)
{
ans.push_back(v[x]);
x=pred[x];
}
reverse(ans.begin(),ans.end());
for(auto it: ans)
fprintf(g,"%d ",it);
return 0;
}