Pagini recente » Diferente pentru utilizator/razveh intre reviziile 4 si 1 | Atasamentele paginii Profil MaraaM | Istoria paginii utilizator/numai_eu | Istoria paginii utilizator/marionicolae4 | Cod sursa (job #2830544)
#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];
}
sort(sortat+1,sortat+N+1);
for(int i=1;i<=N;i++)
poz[i]=lower_bound(sortat+1,sortat+N+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;
}