Pagini recente » Cod sursa (job #1769563) | Cod sursa (job #1074302) | Cod sursa (job #1798633) | Cod sursa (job #1339181) | Cod sursa (job #710010)
Cod sursa(job #710010)
#include <iostream>
#include <fstream>
#include <string>
#include <cstdio>
using namespace std;
int v[100001];
int n;
ifstream in("scmax.in");
ofstream out("scmax.out");
pair <int,int> dinamic[100001];
int prev[100001],nr;
int cauta(int x)//// cel mai mare x la care putem lipii(si primul)
{
int i,pas=1<<16;
for(i=0;pas!=0;pas/=2)
{
if(i+pas<=nr&&dinamic[i+pas].first<x)
i+=pas;
}
return i;
}
void dinamica1()
{
int j;
dinamic[++nr].second = 1;
dinamic[nr].first = v[1];
for(int i=2;i<=n;i++)
{
j=cauta(v[i]);
dinamic[j+1].first=v[i];
dinamic[j+1].second=i;
prev[i] = dinamic[j].second;
if(j==nr) nr++;
}
}
void refac(int p)
{
if(prev[p]) refac(prev[p]);
out << v[p] << " ";
}
void reasamblare()
{
out << nr << "\n";
int show = dinamic[nr].second;
refac(show);
/*
while(show>0)
{
out << v[show] << " ";
show = prev[show] ;
}
*/
}
int main()
{
string tmp;
in>>tmp;
n=atoi(tmp.c_str());
for (int i =1;i<=n;i++)
{
in>>tmp;
v[i]=atoi(tmp.c_str());
}
dinamica1();
reasamblare();
return 0;
}