Cod sursa(job #2908337)

Utilizator StefanL2005Stefan Leustean StefanL2005 Data 2 iunie 2022 21:43:48
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

int caut(vector<int> V, int t, int c1, int c2)
{
    int ans = 0;
    while (c2 >= c1)
    {
        int m = (c1 + c2) / 2;
        if (t > V[m])
            c1 = m + 1;
        else
        {
            c2 = m - 1;
            ans = m;
        }
    }
    if (t <= V[ans])
        return ans;
    else
        return -1;
}

int caut2_0(vector< pair<int, int> > V, int t, int c1, int c2)
{
    int ans = 0;
    while (c2 >= c1)
    {
        int m = (c1 + c2) / 2;
        if (t > V[m].first)
            c1 = m + 1;
        else
        {
            c2 = m - 1;
            ans = m;
        }
    }
    if (t <= V[ans].first)
        return ans;
    else
        return -1;
}

bool rule(pair<int, int> a, pair<int, int> b)
{
    return a.first < b.first;
}

int main()
{
    int n;
    in>> n;
    vector<int> v(n), Lmin;
    vector< pair<int, int> > iv;

    for (int i = 0; i < n; i++)
        in>> v[i];

    Lmin.push_back(v[0]);
    iv.push_back(make_pair(v[0], 0));
    int nr = 1;

    for (int i = 1; i < n; i++)
    {
        int poz = caut(Lmin, v[i], 0, nr - 1);

        if (poz == -1)
        {
            Lmin.push_back(v[i]);
            iv.push_back(make_pair(v[i], Lmin[nr - 1]));
            nr++;
        }
        else
        {
            if(poz == 0)
                iv.push_back(make_pair(v[i], 0));
            else
                iv.push_back(make_pair(v[i], poz - 1));
            Lmin[poz] = v[i];
        }
    }

    sort(iv.begin(), iv.end(), rule);

    out<< nr << "\n";
    v.clear();
    /*
    int c;
    c = caut2_0(iv, Lmin[nr - 1], 0, n);
    v.push_back(iv[c].first);
    c = iv[c].second;
    while (c != 0)
    {
        c = caut2_0(iv, c, 0, n);
        v.push_back(iv[c].first);
        c = iv[c].second;
    }

    for (int i = nr - 1; i >= 0; i--)
        out<< v[i] << " ";*/
    return 0;
}