Se consideră un șir a[1], a[2], …, a[n] de numere distincte din mulțimea {1,2,…,n}. O operație constă din extragerea unui număr din șir de la o anumită poziție și inserarea lui în altă poziție a șirului. De exemplu, dacă a = 1, 2, 5, 3, 6, 4, atunci 5 poate fi inserat după 3 și se obține a = 1, 2, 3, 5, 6, 4.
Cerința
Să se obțină șirul ordonat crescător efectuând un număr minim de operații de inserare.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spații.
Date de ieșire
Programul va afișa pe ecran un singur număr natural reprezentând numărul minim de operații de inserare necesar ordonării crescătoare a șirului.
Restricții și precizări
1 ≤ n ≤ 100 000
Exemplu
Intrare
6 1 2 5 3 6 4
Ieșire
2
Explicație
O soluție de ordonare efectuând două operații este următoarea. Se ia 5 și se inserează după 3. Se obține 1, 2, 3, 5, 6, 4. Se ia apoi 4 și se inserează după 3. Se obține 1, 2, 3, 4, 5, 6.
#include <bits/stdc++.h>
using namespace std;
int n , x , l , A[100001] , p;
int cautare_binara(int x , int n)
{
int st = 1 , dr = n;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(A[mij] > x) dr = mij - 1;
else st = mij + 1;
}
return st;
}
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> x;
p = cautare_binara(x , l);
if(A[p] <= x) l++ , p = l;
A[p] = x;
}
cout << n - l;
}