Pagini recente » Cod sursa (job #44683) | Cod sursa (job #284863) | Cod sursa (job #2570111) | Cod sursa (job #620902) | Cod sursa (job #1704515)
#include <fstream>
#include <set>
#include <functional>
#include <algorithm>
using namespace std;
const int N_MAX = 300005;
class InputReader {
public:
InputReader() {}
InputReader(const char *file_name) {
input_file = fopen(file_name, "r");
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
inline InputReader &operator >>(int &n) {
while (buffer[cursor] < '0' || buffer[cursor] > '9') {
advance();
}
n = 0;
while ('0' <= buffer[cursor] && buffer[cursor] <= '9') {
n = n * 10 + buffer[cursor] - '0';
advance();
}
return *this;
}
private:
FILE *input_file;
static const int SIZE = 1 << 17;
int cursor;
char buffer[SIZE];
inline void advance() {
++ cursor;
if (cursor == SIZE) {
cursor = 0;
fread(buffer, SIZE, 1, input_file);
}
}
};
int N, D;
int indx[N_MAX];
pair<int, int> v[N_MAX];
multiset<pair<int, int>> _set;
int main() {
InputReader f("partitie.in");
ofstream g("partitie.out");
f >> N >> D;
for(int i = 1; i <= N; i++)
f >> v[i].first, v[i].second = i;
sort(v+1, v+N+1);
for(int i = 1; i <= N; i++) {
if(_set.begin()->first <= v[i].first - D) {
indx[v[i].second] = _set.begin()->second;
_set.erase(_set.begin());
}
else {
indx[v[i].second] = _set.size() + 1;
}
_set.insert(make_pair(v[i].first, indx[v[i].second]));
}
g << _set.size() << '\n';
for(int i = 1; i <= N; i++)
g << indx[i] << '\n';
return 0;
}