#include <chrono>
#include <cstdint>
#include <iostream>
#include <numeric>
#include <stdexcept>
#include <string_view>
#include <vector>
int main(int argc,char** argv) {
    if(argc>2 || (argc==2 && std::string_view(argv[1])!="--csv")) throw std::invalid_argument("use --csv");
    std::vector<std::uint64_t> values(100000);std::iota(values.begin(),values.end(),1ULL);
    constexpr std::uint64_t baseline=5000050000ULL;
    if(std::accumulate(values.begin(),values.end(),0ULL)!=baseline) throw std::runtime_error("warmup");
    std::vector<long long> samples;std::uint64_t checksum=0;
    for(std::uint64_t trial=0;trial<5;++trial) {
        values[0]=1+trial;
        const auto start=std::chrono::steady_clock::now();
        const auto sum=std::accumulate(values.begin(),values.end(),0ULL);
        const auto stop=std::chrono::steady_clock::now();
        if(sum!=baseline+trial) throw std::runtime_error("sum");
        samples.push_back(std::chrono::duration_cast<std::chrono::nanoseconds>(stop-start).count());
        checksum+=sum;
    }
    if(checksum!=25000250010ULL) throw std::runtime_error("checksum");
    if(argc==2) {
        std::cout<<"trial,elapsed_ns\n";
        for(std::size_t i=0;i<samples.size();++i) std::cout<<i<<','<<samples[i]<<'\n';
    } else std::cout<<"samples="<<samples.size()<<" checksum="<<checksum<<'\n';
}
