Pagini recente » Cod sursa (job #1681947) | Cod sursa (job #1045948) | Cod sursa (job #1684772) | Cod sursa (job #1181631) | Cod sursa (job #1083306)
#include <iostream>
#include <fstream>
#define maxn 100073
using namespace std;
int a[maxn];
int n;
int lungime_maxima;//lungimea celui mai lung subsir
int lungime_curenta; //lungimea calculata la fiecare pas
int poz[maxn]; //ce pozitie ocupa urmatorul numar din sir
int pozinceput[maxn]; //a[pozinceput[i]]- primul element ce apare intr-un subsir de lungime i
int bin(int start, int sfarsit, int valoare)//verific de la sfarsit la inceput ce elemente pot adauga la subsir,
{ //comparand cu celelalte
int mijloc;
while (start<=sfarsit)
{
mijloc=start + (sfarsit-start)/2;
if (valoare<a[pozinceput[mijloc]])
start=mijloc+1;
else sfarsit=mijloc-1;
}
return start;
}
int main()
{
ifstream in("scmax.in");
ofstream out("scmax.out");
in>>n;
for (int i=1;i<=n;i++)
in>>a[i];
a[0]=2000000073;//ii dau o valoare mare ca sa nu intre in subsir
for (int i=n;i>=1;i--)
{
poz[i]=0;
lungime_curenta=bin(1,lungime_maxima,a[i]);//caut lungime actuala
if (lungime_curenta>lungime_maxima)
{
poz[i]=pozinceput[lungime_curenta-1]; //calculez pozitia actuala in subsir
lungime_maxima=lungime_curenta;
pozinceput[lungime_maxima]=i; //il iau ca fiind primul element din subsir, deoarece merg in vector de la sfarsit
}
else
{
poz[i]=pozinceput[lungime_curenta-1];
if (a[pozinceput[lungime_curenta]]<a[i]) //verific sa fie strict crescator
pozinceput[lungime_curenta]=i;
}
}
out<<lungime_maxima<<"\n";
for (int i=pozinceput[lungime_maxima];i>0;i=poz[i]) //afisez
{
out<<a[i]<<" ";
}
return 0;
}