Cod sursa(job #1829692)

Utilizator RadduFMI Dinu Radu Raddu Data 15 decembrie 2016 15:31:34
Problema Farfurii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>
#define ll long long
#define len(x) x&(-x)
using namespace std;
ifstream f("farfurii.in");
ofstream g("farfurii.out");
int n, use[100005], v[100005], aib[100005];
string sir;
void Update(int x)
{
	int i;
	for (i = x; i <= n; i += len(i))
		aib[i] ++;
}

int Query(int x)
{
	int res = 0, i;
	for (i = x; i; i -= len(i))
		res += aib[i];
	return res;
}
ll k;

int solve(int alk)
{
	int i, ans = 0 , res;
	for (i = 17; i>=0; i--)
	{
		res = (ans | (1 << i));
		if (res <= n && res - Query(res) <= alk) 
			ans = res;
	}

	return ans + 1;
}

int main()
{
	int i, j = 0, cnt, lft, act=0, kth;
	f >> n >> k;

	for (i = 1; i <= n; i++)
	{
	
		
		lft = (n - i) * (n - i - 1) / 2;

		kth = max(k - act - lft, 1LL*0);

		j = solve(kth);
		
	    v[i] = j;
		
		Update(j);
					
		act += kth;
	}
	
	for (i = 1; i <= n; i++)
	{
	

		sir +=to_string(v[i])+" ";
	}

	g << sir;
	return 0;
}