Pagini recente » Cod sursa (job #2210966) | Cod sursa (job #2214832) | Cod sursa (job #1546342) | Cod sursa (job #2277748) | Cod sursa (job #2365083)
#include<bits/stdc++.h>
using namespace std;
#define NMAX 131072
#define INF 0x3f3f3f3f
ifstream fin("scmax.in");
ofstream fout("scmax.out");
vector<int> val;
int dp[NMAX],pre[NMAX];
vector<pair<int,int> > sorted;
int n,N;
int arb[4*NMAX];
bool cmp(const pair<int,int> &lhs,const pair<int,int> &rhs)
{
if(lhs.first==rhs.first)
return lhs.second>rhs.second;
return lhs.first<rhs.first;
}
void initialize()
{
for(int i=N;i<2*N;i++)
arb[i]=i-N;
}
void add(int poz,int x)
{
dp[poz]=x;
poz+=N;
for(poz/=2;poz>=1;poz/=2)
{
if(dp[arb[2*poz+1]]>dp[arb[2*poz]])
arb[poz]=arb[2*poz+1];
else arb[poz]=arb[2*poz];
}
}
int query(int a,int b,int k,int x,int y)
{
if(y<a||b<x) return N;
if(a<=x&&y<=b) return arb[k];
int d=(x+y)/2;
int q1=query(a,b,2*k,x,d);
int q2=query(a,b,2*k+1,d+1,y);
if(dp[q1]>dp[q2]) return q1;
else return q2;
}
void afisare()
{
int pow=1;
for(int i=1;i<2*N;i++)
{
fout<<arb[i]<<" ";
if(i==(1<<pow)-1)
{
pow++;
fout<<'\n';
}
}
}
int main()
{
fin>>n;
N=n;
while((N&(N-1))!=0)
++N;
for(int i=0;i<n;i++)
{
val.push_back(int());
fin>>val[i];
sorted.push_back({val[i],i});
}
dp[N]=0;
sort(sorted.begin(),sorted.end(),cmp);
initialize();
for(auto x:sorted)
{
int index=x.second;
int maxI=query(0,index-1,1,0,N-1);
pre[index]=maxI;
add(index,dp[maxI]+1);
// afisare();
}
vector<int> ans;
int maxI=n;
for(int i=0;i<n;i++)
if(dp[i]>dp[maxI]) maxI=i;
while(maxI!=N)
{
ans.push_back(val[maxI]);
maxI=pre[maxI];
}
fout<<ans.size()<<'\n';
for(auto it=ans.rbegin();it!=ans.rend();++it)
fout<<*it<<' ';
return 0;
}