Cod sursa(job #1073814)

Utilizator classiusCobuz Andrei classius Data 6 ianuarie 2014 20:42:06
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
using namespace std;

#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<utility>
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<numeric>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<deque>

#define FILES

#ifdef FILES
#include<fstream>
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#else
#include<iostream>
#endif

#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define ALL(a) a.begin(),a.end()
#define p_b(a) push_back(a)
#define m_p(a,b) make_pair(a,b)
#define p_p(a,b) p_b(m_p(a,b))

typedef unsigned char uchar;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vint;
typedef queue<int> qint;
typedef pair<int,int> pii;
typedef queue<pii> qpii;
typedef vector<pii> vpii;
typedef vector<string> vstr;
typedef vector<ll> vll;
typedef deque<int> dqint;
typedef deque<ll> dqll;
typedef map<string,int> mpstri;
typedef map<int,int> mpinti;
typedef map<string,string> mpstrs;
typedef map<string,vstr> mpstrvs;
const int INFI=(1LL<<31)-1;
const ll INFL=(1LL<<62);
const double eps=1e-7;
const long double pi=acos(-1.0);
const int MAXN=100001;

int v[MAXN],u[MAXN],arb[4*MAXN],sl[MAXN];

void update(int nod,int lf,int rt,int pz,int vl){
    arb[nod]=max(vl,arb[nod]);
    if(lf==rt){
        return;
    }

    int mid=(lf+rt)/2;

    if(pz<=mid){
        update(nod*2,lf,mid,pz,vl);
    } else{
        update(nod*2+1,mid+1,rt,pz,vl);
    }

    return;
}

int query(int nod,int lf,int rt,int les){
    if(lf==rt){
        return arb[nod];
    }

    int mid=(lf+rt)/2,mx=0;

    if(les>mid){
        mx=query(nod*2+1,mid+1,rt,les);
        mx=max(mx,arb[nod*2]);
    } else{
        mx=max(mx,query(nod*2,lf,mid,les));
    }

    return mx;
}

int main(){
    int n;
    cin>>n;

    mpinti key;

    for(int i=1;i<=n;i++){
        cin>>u[i];
        v[i]=u[i];
    }

    sort(u+1,u+n+1);

    for(int i=1;i<=n;i++){
        if(key.find(u[i])==key.end()){
            key[u[i]]=key.size();
        }
    }

    for(int i=1;i<=n;i++){
        v[i]=key[v[i]];
    }

    update(1,1,n,v[1],1);
    sl[1]=1;

    for(int i=2;i<=n;i++){
        int mx=query(1,1,n,v[i]-1);
        sl[i]=mx+1;
        update(1,1,n,v[i],mx+1);
    }

    cout<<*max_element(sl+1,sl+n+1);

    return 0;
}