Problem p02618 (C++)

Buggy submission (status: Runtime Error):
/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;
template <typename T1, typename T2> inline void chkmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chkmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
#define files(FILENAME)                                                        \
  read(FILENAME);                                                              \
  write(FILENAME)
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define all(c) (c).begin(), (c).end()
#define sz(c) (int)(c).size()
#define left left228
#define right right228
#define y1 y1228
#define mp make_pair
#define pb push_back
#define y2 y2228
#define rank rank228
using ll = long long;
using ld = long double;
const string FILENAME = "input";
const int MAXN = 370;

int d;
int t[MAXN];
int c[MAXN];
int s[MAXN][29];
int last[MAXN];
int q;
set<int> pos[29];
mt19937 as;

ll calcCost() {
  for (int i = 1; i <= 26; i++) {
    last[i] = 0;
  }
  ll sat = 0;
  for (int i = 1; i <= d; i++) {
    sat += s[i][t[i]];
    last[t[i]] = i;
    for (int j = 1; j <= 26; j++) {
      sat -= c[j] * (i - last[j]);
    }
  }
  return sat;
}

ll cur;

void addSeg(int l, int r, int i, int mod) {
  l++;
  int t = r - l;
  if (t <= 0) {
    return;
  }
  cur -= (ll)mod * c[i] * t * (t + 1) / 2;
}

void del(int i, int x) {
  cur -= s[x][i];
  auto it = pos[i].find(x);
  it++;
  int nr = *it;
  it--;
  it--;
  int nl = *it;
  addSeg(x, nr, i, -1);
  addSeg(nl, x, i, -1);
  pos[i].erase(x);
  addSeg(nl, nr, i, 1);
}

void add(int i, int x) {
  cur += s[x][i];
  pos[i].insert(x);
  auto it = pos[i].find(x);
  it++;
  int nr = *it;
  it--;
  it--;
  int nl = *it;
  addSeg(x, nr, i, 1);
  addSeg(nl, x, i, 1);
  addSeg(nl, nr, i, -1);
}

void query(int id, int cs) {
  del(t[id], id);
  t[id] = cs;
  add(t[id], id);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  //	read(FILENAME);
  cin >> d;
  for (int i = 1; i <= 26; i++) {
    cin >> c[i];
    pos[i].insert(0);
    pos[i].insert(d + 1);
  }
  for (int i = 1; i <= d; i++) {
    for (int j = 1; j <= 26; j++) {
      cin >> s[i][j];
    }
  }
  for (int i = 1; i <= d; i++) {
    t[i] = as() % 26 + 1;
    pos[t[i]].insert(i);
  }
  cur = calcCost();
  while (double(clock()) / CLOCKS_PER_SEC <= 1.8) {
    int f = as() % d + 1;
    int opt = -1;
    int pos = -1;
    for (int f1 = 1; f1 <= 26; f1++) {
      query(f, f1);
      if (opt < cur) {
        opt = cur;
        pos = f1;
      }
    }
    query(f, pos);
  }
  for (int i = 1; i <= d; i++) {
    cout << t[i] << '\n';
  }
  return 0;
}


Fixed submission:
/*
ЗАПУСКАЕМ
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;
template <typename T1, typename T2> inline void chkmin(T1 &a, T2 b) {
  if (a > b)
    a = b;
}
template <typename T1, typename T2> inline void chkmax(T1 &a, T2 b) {
  if (a < b)
    a = b;
}
#define files(FILENAME)                                                        \
  read(FILENAME);                                                              \
  write(FILENAME)
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define all(c) (c).begin(), (c).end()
#define sz(c) (int)(c).size()
#define left left228
#define right right228
#define y1 y1228
#define mp make_pair
#define pb push_back
#define y2 y2228
#define rank rank228
using ll = long long;
using ld = long double;
const string FILENAME = "input";
const int MAXN = 370;

int d;
int t[MAXN];
int c[MAXN];
int s[MAXN][29];
int last[MAXN];
int q;
set<int> pos[29];
mt19937 as;

ll calcCost() {
  for (int i = 1; i <= 26; i++) {
    last[i] = 0;
  }
  ll sat = 0;
  for (int i = 1; i <= d; i++) {
    sat += s[i][t[i]];
    last[t[i]] = i;
    for (int j = 1; j <= 26; j++) {
      sat -= c[j] * (i - last[j]);
    }
  }
  return sat;
}

ll cur;

void addSeg(int l, int r, int i, int mod) {
  l++;
  int t = r - l;
  if (t <= 0) {
    return;
  }
  cur -= (ll)mod * c[i] * t * (t + 1) / 2;
}

void del(int i, int x) {
  cur -= s[x][i];
  auto it = pos[i].find(x);
  it++;
  int nr = *it;
  it--;
  it--;
  int nl = *it;
  addSeg(x, nr, i, -1);
  addSeg(nl, x, i, -1);
  pos[i].erase(x);
  addSeg(nl, nr, i, 1);
}

void add(int i, int x) {
  cur += s[x][i];
  pos[i].insert(x);
  auto it = pos[i].find(x);
  it++;
  int nr = *it;
  it--;
  it--;
  int nl = *it;
  addSeg(x, nr, i, 1);
  addSeg(nl, x, i, 1);
  addSeg(nl, nr, i, -1);
}

void query(int id, int cs) {
  del(t[id], id);
  t[id] = cs;
  add(t[id], id);
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  //	read(FILENAME);
  cin >> d;
  for (int i = 1; i <= 26; i++) {
    cin >> c[i];
    pos[i].insert(0);
    pos[i].insert(d + 1);
  }
  for (int i = 1; i <= d; i++) {
    for (int j = 1; j <= 26; j++) {
      cin >> s[i][j];
    }
  }
  for (int i = 1; i <= d; i++) {
    t[i] = as() % 26 + 1;
    pos[t[i]].insert(i);
  }
  cur = calcCost();
  while (double(clock()) / CLOCKS_PER_SEC <= 1.8) {
    int f = as() % d + 1;
    int opt = -1e9;
    int pos = -1;
    for (int f1 = 1; f1 <= 26; f1++) {
      query(f, f1);
      if (opt < cur) {
        opt = cur;
        pos = f1;
      }
    }
    query(f, pos);
  }
  for (int i = 1; i <= d; i++) {
    cout << t[i] << '\n';
  }
  return 0;
}