Pagini recente »
Istoria paginii runda/2019-10-24-clasa-7-tema-7-optionala/clasament
|
Istoria paginii runda/2017-11-26-clasa-5-tema-17
|
Clasament 2022-09-17-clasa-7-tema-01
|
Clasament 2022-03-19-clasa-5-concurs07-cursuri-performanta
|
Cod sursă (job #730404)
Cod sursă (job
#730404)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5;
const int NIL = -1;
ifstream fin( "arbperm.in" );
ofstream fout( "arbperm.out" );
int v[NMAX+1];
int poz[NMAX+1];
int aib[NMAX+1];
int n;
void update( int poz ) {
while( poz <= n ) {
aib[poz]++;
poz += ( poz & ( -poz ) );
}
}
int query( int poz ) {
int sum = 0;
while( poz ) {
sum += aib[poz];
poz -= ( poz & ( -poz ) );
}
return sum;
}
int ans[NMAX+1];
int perm[NMAX+1];
int main() {
int i, k, rest, p, cop;
fin >> n >> k;
for( i = 0; i < n; i++ )
fin >> v[i];
for( i = 0; i < n; i++ ) {
poz[v[i]] = query( v[i] );
update( v[i] );
}
for( i = n; i >= 2; i-- ) {
rest = k % i;
poz[i] = poz[i] + rest;
k = k / i;
if( poz[i] >= i )
poz[i] %= i, k++;
}
for( i = 0; i <= n; i++ )
aib[i] = 0;
for( i = n; i >= 1; i-- ) {
p = poz[i] + 1;
cop = p;
p += query( p );
ans[i] = p;
update( cop );
}
for( i = 1; i <= n; i++ )
perm[ans[i]] = i;
for( i = 1; i <= n; i++ )
fout << perm[i] << " ";
return 0;
}