Cod sursa(job #2008075)

Utilizator Y0da1NUME JMECHER Y0da1 Data 5 august 2017 11:55:06
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
//24 12 15 15 19
using namespace std;
int n;
vector<pair<int, int> > a (100002);
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;
    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[i]=temp;
        //a.push_back(temp);
    }
    sort(a.begin()+1, a.begin()+n+1, criteriu);
    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;
        }
    int j=2;
    ans[1]=orig[curr];
    for(int i=curr-1;i;--i)
        if(d[i]==d[curr]-1)
            {
                ans[j]=orig[i];
                curr=i;
                ++j;
            }
    out<<maxim<<"\n";
    for(int i=maxim;i;--i)
        out<<ans[i]<<" ";
    return 0;
}