Pagini recente » Cod sursa (job #584348) | Cod sursa (job #594456) | Cod sursa (job #1493536) | Cod sursa (job #668398) | Cod sursa (job #3001462)
#include <cstdio>
#include <cmath>
#include <climits>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
#include <algorithm>
#define NMAX 100003
using namespace std;
FILE* fin, * fout;
int n,m,niv;
int v[NMAX];//elementele
int tata[NMAX];//idee ca la paduri de multimi(retin tatal elementului pe care vreau sa il pun in subsir ca fiind elementul de pe poz-1 de unde vreau sa il pun)
int sortat[NMAX];//vectorul pt scm
int cBin(int nr)
{
int st = 1, dr = niv,sol=niv+1;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (v[sortat[mij]] >= nr)
{
dr = mij - 1;
sol = mij;
}
else {
st = mij + 1;
}
}
return sol;
}
void adaugSCM(int poz)
{
int pozitieSortat = cBin(v[poz]);
tata[poz] = sortat[pozitieSortat - 1];//ii setez tatal
sortat[pozitieSortat] = poz;
niv = max(niv, pozitieSortat);
}
int main()
{
fin = fopen("scmax.in", "r");
fout = fopen("scmax.out", "w");
fscanf(fin, "%d", &n);
for (int i = 1; i <= n; i++)
{
fscanf(fin, "%d", &v[i]);
adaugSCM(i);
}
fprintf(fout, "%d\n", niv);
vector<int>sol;
int elem = sortat[niv];
sol.push_back(elem);
while (tata[elem] > 0)
{
elem = tata[elem];
sol.push_back(elem);
}
for (int i = sol.size()-1; i >= 0; i--)
{
fprintf(fout, "%d ", v[sol[i]]);
}
return 0;
}