Pagini recente » Cod sursa (job #614213) | Cod sursa (job #547566) | Cod sursa (job #210738) | Cod sursa (job #211531) | Cod sursa (job #3029931)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int nmax = 100000;
int dp[nmax + 1]; ///dp[x] sirul de lungime x care se termina in valorea lui dp[x]
vector<int>afis;
int v[nmax + 1];
int poz[nmax + 1];
int find_better(int value, int cnt)
{
int idx;
int st = 1;
int dr = cnt;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(dp[mij] > value)
{
dr = mij - 1;
idx = mij;
}
else
st = mij + 1;
}
return idx;
}
int main()
{
int n;
in>>n;
int cnt = 0;
int lastpoz;
for(int i = 1; i <= n; i++)
{
in>>v[i];
if(dp[cnt] < v[i]) ///gasesc un nr mai mare =>prelungesc secventa
{
cnt++;
dp[cnt] = v[i];
lastpoz = i;
poz[i] = cnt;
}
else///gasesc cel mai mic dp mai mare decat v[i]
{
int index = find_better(v[i],cnt);
dp[index] = v[i];
poz[i] = index;
}
}
out<<cnt<<'\n';
for(int i = n; i >= 1; i--)
{
if(poz[i] == cnt)
{
cnt--;
afis.push_back(v[i]);
}
}
for(int i = afis.size() - 1; i >= 0; i--)
out<<afis[i]<<' ';
return 0;
}