Pagini recente » Atasamentele paginii Profil Zanarok | Atasamentele paginii Profil elax | Profil spx | Monitorul de evaluare | Cod sursa (job #2830547)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX=100005;
int N, v[NMAX], poz[NMAX], sortat[NMAX], dp[NMAX], sol, nxt=2e9+5;
/// vom determina lungimea secventei maxime care se termina
/// intr-un punct mai pic strict decat punctul curent
/// arborele va avea ca pozitii pozitiile elementelor
/// fin vectorul sortat
struct FenwickTree{
int a[NMAX];
void update(int x, int val)
{
for(int i=x;i<=N;i+=(i^(i-1))&i)
if(val>a[i])
a[i]=val;
}
int query(int x)
{
int mx=0;
for(int i=x;i>0;i-=(i^(i-1))&i)
if(a[i]>mx)
mx=a[i];
return mx;
}
}AIB;
void afisare(int p)
{
if(p==0)
return;
if(dp[p]==sol and p<nxt){
sol--;
afisare(p-1);
fout<<v[p]<<' ';
return;
}
afisare(p-1);
}
int main()
{
fin>>N;
for(int i=1;i<=N;i++){
fin>>v[i];
sortat[i]=v[i];
}
int h=1;
sort(sortat+1,sortat+N+1);
for(int i=2;i<=N;i++)
if(sortat[i]!=sortat[h])
sortat[++h]=sortat[i];
for(int i=1;i<=N;i++)
poz[i]=lower_bound(sortat+1,sortat+h+1,v[i])-sortat;
for(int i=1;i<=N;i++){
dp[i]=1+AIB.query(poz[i]-1);
AIB.update(poz[i],dp[i]);
sol=max(sol,dp[i]);
}
fout<<sol<<'\n';
afisare(N);
fin.close();
fout.close();
return 0;
}