Pagini recente » Cod sursa (job #1892165) | Cod sursa (job #2275763) | Cod sursa (job #1246132) | Cod sursa (job #2762148) | Cod sursa (job #1836724)
#include <fstream>
using namespace std;
#define nmax 100005
ifstream f("scmax.in");
ofstream g("scmax.out");
int ipoz, n, v[nmax], indx_st, indx_dr, act_pos, mijloc;
struct insf{int val,idx;}pos[nmax];
int main()
{
f >> n;
for(int i = 1; i <= n; ++ i)
f >> v[i];
pos[1].val = v[1], pos[1].idx = 1;
ipoz = 1;//pozitia actuala
for(int 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;
else// daca este mai mic se actualizeaza noul index
pos[act_pos].val = v[i], pos[act_pos].idx = i;
}
g << ipoz << '\n';
for(int i =1 ; i <= ipoz; ++i)
g << pos[i].val << " ";
return 0;
}