// Original CPU teaching model; not a device simulator or benchmark.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <stdexcept>

void require(bool ok) { if (!ok) throw std::runtime_error("model check failed"); }

int chunked(const std::vector<int>& a) {
 int total=0;
 for(std::size_t base=0;base<a.size();base+=3) {
  int local=0;for(std::size_t i=base;i<std::min(base+3,a.size());++i) local+=a[i];total+=local;
 }
 return total;
}
int main() {
 int cases=0;
 for(int n=0;n<=4;++n) {
  int combinations=1;for(int i=0;i<n;++i) combinations*=3;
  for(int mask=0;mask<combinations;++mask) {
   int code=mask;std::vector<int> a;const int values[3]={-1,0,2};
   for(int i=0;i<n;++i){a.push_back(values[code%3]);code/=3;}
   require(chunked(a)==std::accumulate(a.begin(),a.end(),0));++cases;
  }
 }
 require(cases==121);std::cout<<"cases="<<cases<<" mismatch=0\n";
}

