Cod sursa(job #2615736)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 15 mai 2020 13:08:39
Problema Order Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
// By Stefan Radu

#include <algorithm>
#include <fstream>
#include <iomanip>
#include <cassert>
#include <vector>
#include <string>
#include <cctype>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <map>
#include <set>

using namespace std;

#define sz(x) (int)(x).size()

typedef pair < int, int > pii;
typedef long long ll;
typedef long double ld;
typedef unsigned int ui;
typedef unsigned long long ull;

ifstream cin("order.in");
ofstream cout("order.out");

vector < int > tree;

void update(int val, int poz, int &n) {
  while (poz <= n) {
    tree[poz] += val;
    poz += (poz & -poz);
  }
}

int query(int poz) {
  int sum = 0;
  while (poz) {
    sum += tree[poz];
    poz ^= (poz & -poz);
  }
  return sum;
}

int main() {

#ifdef STEF
  freopen("input", "r", stdin);
  freopen("output", "w", stdout);
#endif

  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);

  int n;
  cin >> n;

  tree.resize(n + 1, 0);
  for (int i = 1; i <= n; ++ i) {
    update(1, i, n);
  }

  int index = 1, left = n;
  for (int i = 1; i <= n; ++ i) {

    index += i - 1;
    index %= left;

    int st = 1, dr = n, ans = -1;
    while (st <= dr) {
      int mid = (st + dr) >> 1;
      if (query(mid) < index + 1) {
        st = mid + 1;
      }
      else {
        ans = mid;
        dr = mid - 1;
      }
    }

    cout << ans << ' ';
    update(-1, ans, n);
    -- left;
  }
}