# PBinfo #2878 – prev_perm – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Scrieți definiția completă a subprogramului C++:

void prev_perm(int n, int P[]);
Subprogramul are doi parametri:


n – prin care primește un număr natural
P – prin care primește un tablou unidimensional cu n elemente ce reprezintă o permutare a mulțimii {1,2,...,n}.

Subprogramul întoarce prin parametrul P permutarea anterioară din punct de vedere lexicografic.

Restricții și precizări

2 ≤ n ≤ 100000;
elementele tabloului unidimensional P sunt indexate de la 1;
în toate testele, pentru permutarea P există permutare anterioară.

Exemplu:
Pentru n=5 și P={2,3,1,4,5},  după apel P={2,1,5,4,3}.

## Cod sursă C++

```cpp
void prev_perm(int n,int P[])
{
    int i=n;
    while(i>1 && P[i-1]<=P[i])
        i--;
    int j=i-1;
    while(j+1<=n && P[j+1]<=P[i-1])
        j++;
    swap(P[i-1],P[j]);
    reverse(P+i,P+n+1);
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2878)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2878/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2878/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
