Pagini recente » Cod sursa (job #2340221) | Cod sursa (job #1762705) | Cod sursa (job #134694) | Cod sursa (job #2540734) | Cod sursa (job #677094)
Cod sursa(job #677094)
#include<fstream>
#include<vector>
using namespace std;
#define NMAX 100010
int n;
int a[NMAX],poz[NMAX];
vector<int> q;
int elem,pozcautare,lungscmax;
int sol[NMAX];
void read()
{
int i;
ifstream fin("scmax.in");
fin>>n;
for (i=1; i<=n; ++i)
fin>>a[i];
fin.close();
}
void cauta(int st, int dr)
{
int mijl = (dr - st) / 2 + st;
if (st <= dr)
if (q[mijl] >= elem)
{
pozcautare = min(pozcautare, mijl);
cauta(st, mijl-1);
} else
cauta(mijl+1, dr);
}
void solve()
{
int i;
for (i=1; i<=n; ++i)
{
pozcautare = NMAX; elem = a[i];
cauta( 0, (int)q.size()-1 );
if (pozcautare == NMAX)
{
q.push_back(a[i]);
poz[i] = q.size() - 1;
} else
{
q[pozcautare] = a[i];
poz[i] = pozcautare;
}
}
lungscmax = q.size();
}
void write()
{
int i,k;
ofstream fout("scmax.out");
fout<<lungscmax<<'\n';
k = lungscmax; i = n;
while (k != 0)
{
if (poz[i] == k - 1)
{
sol[k] = a[i];
k--;
}
i--;
}
for (i=1; i<=lungscmax; ++i)
fout<<sol[i]<<" ";
fout<<'\n';
fout.close();
}
int main()
{
read();
solve();
write();
return 0;
}