Cod sursa(job #2008031)

Utilizator Y0da1NUME JMECHER Y0da1 Data 4 august 2017 23:42:20
Problema Subsir crescator maximal Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
//24 12 15 15 19
using namespace std;
int n;
vector<pair<int, int> > a;
int d[100002], aib[100002], ans[100002], orig[100002];
void update (int pos, int val)
{
    for(; pos <=n; pos+=pos&-pos)
        if(val>aib[pos])
            aib[pos]=val;
}
int query(int pos)
{
    int curr = pos+1;
    int maxim = 0;
    for(;pos>0; pos-=pos&-pos)
        if(aib[pos] > maxim)
        {
            maxim=aib[pos];
            //prv[curr] = pos;
        }
    return maxim;
}
bool criteriu (const pair<int, int> a, const pair <int, int> b)
{
    if(a.first==b.first)
        return a.second > b.second;
    return a.first < b.first;
}
int main()
{
    int maxim=0, curr, h=1;
    ifstream in ("scmax.in");
    ofstream out ("scmax.out");
    pair <int, int> temp;
    a.push_back(temp);
    in>>n;
    for(int i=1;i<=n;++i)
    {
        in>>temp.first;
        orig[i]=temp.first;
        temp.second=i;
        a.push_back(temp);
    }
    //for(int i=1;i<=n;++i)
        //cout<<a[i].first<<","<<a[i].second<<" ";
    //cout<<endl;
    sort(a.begin()+1, a.end(), criteriu);
    //for(int i=1;i<=n;++i)
        //cout<<a[i].first<<","<<a[i].second<<" ";
    //cout<<endl;
    /*for(int i=2;i<=n;++i)   //foru asta retard ne scapa de dubluri - oricum nu ne trebe
    {
        if(a[h].first!=a[i].first)
        {
            ++h;
            a[h]=a[i];
        }
    }
    for(int i=1;i<=h;++i)
        cout<<a[i].first<<","<<a[i].second<<" ";
    cout<<endl;*/
    for(int i=1;i<=n;++i)
    {
        d[a[i].second]=query(a[i].second -1) + 1;
        update(a[i].second, d[a[i].second]);
    }
    for(int i=n;i;--i)
        if(maxim<d[i])
        {
            maxim=d[i];
            curr=i;
        }
    //cout<<"CURR "<<curr<<" CURR\n";
    int j=2;
    ans[1]=orig[curr];
    for(int i=curr-1;i;--i)
        if(orig[i]!=orig[i+1])
            {
                ans[j]=orig[i];
                ++j;
            }
    //cout<<"CURR "<<j<<" CURR\n";
    //for(int i=1;i<=n;++i)
    //    cout<<d[i]<<" ";
    //cout<<endl;
    out<<maxim<<"\n";
    for(int i=maxim;i;--i)
        out<<ans[i]<<" ";
    return 0;
}