#include <fstream>
#include <string>
#include <utility>
#include <vector>
 
using namespace std;
 
// Переводит список байт в соответствующее ему число
int bytesToNumber(const vector<char> &bytes, int start, int end) {
  int x = 0;
  for (int i = end - 1; i >= start; --i) {
    x = x * 256  + (unsigned char)bytes[i];
  }
  return x;
}
 
// Возвращает ближайшее к x значение из отрезка [mn, mx]
int fit(int x, int mn, int mx) {
  return min(max(x, mn), mx);
}
 
struct Color {
  int r, g, b;
   
  Color(int red, int green, int blue) {
    r = red;
    g = green;
    b = blue;
  }
   
  // Доступ к компоненте цвета по индексу (c[1])
  const int& operator [](int i) const {
    if (i == 0) return r;
    if (i == 1) return g;
    if (i == 2) return b;
  }
 
  // Запись в компоненту цвета по индексу (c[1] = 126)
  int& operator [](int i) {
    if (i == 0) return r;
    if (i == 1) return g;
    if (i == 2) return b;
  }
};
 
struct Image {
  vector<char> header;
  vector<char> data;
  int width, height, row_size;
 
  Image(const vector<char> &h, const vector<char> &d) {
    header = h;
    data = d;
    width = bytesToNumber(header, 18, 22);
    height = bytesToNumber(header, 22, 26);
    row_size = (3 * width + 3) / 4 * 4;
  }
 
  // Возвращает цвет пикселя с координатами (x, y)
  Color getPixel(int x, int y) {
    int offset = y * row_size + 3 * x;
    return Color(
        (unsigned char)data[offset + 2],
        (unsigned char)data[offset + 1],
        (unsigned char)data[offset]);
  }
 
  // Устанавливает цвет пикселя с координатами (x, y) в color
  Color setPixel(int x, int y, const Color &color) {
    int offset = y * row_size + 3 * x;
    data[offset + 2] = (unsigned char)fit(color.r, 0, 255);
    data[offset + 1] = (unsigned char)fit(color.g, 0, 255);
    data[offset] = (unsigned char)fit(color.b, 0, 255);
  }
 
  // Сохраняет изображение в файл file_name
  void write(const string &file_name) {
    ofstream f(file_name, ios::binary);
    f.write(header.data(), header.size());
    f.write(data.data(), data.size());
  }
};
 
// Читает изображение из файла file_name
Image readImage(const string &file_name) {
  ifstream f(file_name, ios::binary);
 
  std::vector<char> header(14);
  std::vector<char> data;
 
  f.read(header.data(), header.size());
  int size = bytesToNumber(header, 2, 6);
  int image_data_offset = bytesToNumber(header, 10, 14);
 
  header.resize(image_data_offset);
  f.read(header.data() + 14, image_data_offset - 14);
   
  data.resize(size - image_data_offset);
  f.read(data.data(), data.size());
 
  return Image(header, data);
}
 
int main() {
  Image image = readImage("roma.bmp");
  Image result(image);
   
  for (int y = 0; y < image.height; ++y) {
    for (int x = 0; x < image.width; ++x) {
      Color c = image.getPixel(x, y);
      // Здесь мог бы быть ваш код
      result.setPixel(x, y, new_color);
    }
  }
 
  result.write("result.bmp");
  return 0;
}
