Pagini recente » Cod sursa (job #1554226) | Cod sursa (job #1434672) | Cod sursa (job #1656027) | Cod sursa (job #1607131) | Cod sursa (job #1836736)
#include <fstream>
using namespace std;
#define nmax 100005
ifstream f("scmax.in");
ofstream g("scmax.out");
int ipoz, n, v[nmax], sir[nmax], index[nmax], indx_st, indx_dr,act_pos, j, mijloc, imax;
struct insf{int val,idx;}pos[nmax];
int main()
{
int i;
f >> n;
for( i= 1; i <= n; ++ i)
f >> v[i];
pos[1].val = v[1], pos[1].idx = 1;
ipoz = 1;
for(i = 2; i <= n; ++ i)
{
act_pos = -1;//flag pentru actualizarea indexului unei variri care se repeta
indx_st = 1; indx_dr = ipoz;// indexul stanga dreapta din sirul gasit la un moment dat
while (indx_st <= indx_dr)
{
mijloc = (indx_st + indx_dr) / 2;
if(pos[mijloc].val >= v[i])// verificam daca noua val citita est mai mica sa egala decat cele din subsir
act_pos = mijloc, indx_dr = mijloc - 1;// daca da mergem la elemtul anterior
else
indx_st = mijloc + 1;// daca nu este mai mica se muta limit din stanga spre dreapta
}
if(act_pos == -1)//daca elementul citit este mai mare se adauga in lista
pos[++ ipoz].val = v[i], pos[ipoz].idx = i,index[i] = pos[ipoz - 1].idx;
else// daca este mai mic se actualizeaza noul index
pos[act_pos].val = v[i], pos[act_pos].idx = i,index[i] = pos[act_pos - 1].idx;
}
imax = ipoz;
g << imax << '\n';
ipoz = pos[ipoz].idx;
while(ipoz)
sir[++ j] = v[ipoz], ipoz = index[ipoz];
for(i = imax; i > 0; -- i)
g << sir[i] << " ";
return 0;
}