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

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

int main() {
 const std::vector<std::vector<int>> parts{{3,-1},{4},{2,2}};
 std::vector<int> out,flat;
 int offset=0;
 for(const auto& part:parts) {
  int local=0;
  for(int value:part){local+=value;out.push_back(offset+local);flat.push_back(value);}
  offset+=local;
 }
 std::vector<int> oracle;int sum=0;
 for(int value:flat){sum+=value;oracle.push_back(sum);}
 require(out==oracle && out==std::vector<int>({3,2,6,8,10}));
 std::cout<<"scan=";
 for(std::size_t i=0;i<out.size();++i) std::cout<<(i?" ":"")<<out[i];
 std::cout<<'\n';
}

