Cod sursa(job #1703215)

Utilizator Bodo171Bogdan Pop Bodo171 Data 16 mai 2016 16:36:55
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
int aux[100005],best[100005],i,n,x,mx,val,best2[100005];
vector<int> sol;
struct key
{
    int a,b;
}v[100005];
bool comp(key x,key y)
{
    if(x.a==y.a) return x.b>y.b;
    return x.a<y.a;
}
inline int lbit(int x)
{
    return ((x^(x-1))&x);
}
void update(int x,int val)
{
    for(x;x<=n;x+=lbit(x))
        best[x]=max(best[x],val);
}
int query(int x)
{
    int maxim=0;
    for(x;x>0;x-=lbit(x))
        if(best[x]>maxim) maxim=best[x];
    return maxim;
}
int main()
{
    ifstream f("scmax.in");
    ofstream g("scmax.out");
    f>>n;
    for(i=1;i<=n;i++)
    {
        f>>v[i].a;
        v[i].b=i;
        aux[i]=v[i].a;
    }
    sort(v+1,v+n+1,comp);
    int valoare;
    for(i=1;i<=n;i++)
    {
        valoare=query(v[i].b)+1;
        update(v[i].b,valoare);
        best2[v[i].b]=valoare;
        if(valoare>mx){mx=valoare;}
    }
    g<<mx<<'\n';
    val=(1<<30);
    for(i=n;i>=1;i--)
    {
        if(aux[i]<val&&best2[i]==mx)
        {sol.push_back(aux[i]);val=aux[i];mx--;}
    }
    for(i=sol.size()-1;i>=0;i--) g<<sol[i]<<' ';
    return 0;
}