#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
#include <boost/date_time/gregorian/gregorian.hpp>
struct Log
{
typedef boost::gregorian::date Date;
Date date;
int info;
};
std::ostream& operator <<(std::ostream& os, const Log& l)
{
return os << l.date << " " << l.info;
}
std::istream& operator >>(std::istream& is, Log& l)
{
return is >> l.date >> l.info;
}
Log LowerBound(std::istream& os, Log::Date d)
{
using namespace std;
os.seekg(0, std::ios::end);
streamoff length = os.tellg();
streampos current = 0;
Log l;
for(; length > 0;)
{
streamoff half = length / 2;
streampos mid = current + half;
os.seekg(mid);
string line;
getline(os, line);
if (!(os >> l.date >> l.info))
throw std::runtime_error("bad log format");
if (l.date < d)
{
mid += 1;
current = mid;
length = length - half + 1;
}
else
length = half;
}
return l;
}
template<typename OutIter>
void ReadLogsInRange(
std::istream& logStream, Log::Date from, Log::Date to, OutIter out)
{
using namespace std;
Log l = LowerBound(logStream, from);
*out++ = l;
// Upper Bound
while(logStream >> l && l.date < to)
*out++ = l;
}
int main()
{
using namespace boost::gregorian;
// Create log
Log l;
l.date = Log::Date(2011, Sep, 1);
l.info = 1;
std::stringstream log;
for(int i = 0; i < 1000; ++i)
{
log << l << std::endl;
l.date += days(1);
++l.info;
}
// Read the log
std::vector<Log> range;
ReadLogsInRange(log,
date(2011, Sep, 9), date(2011, Sep, 12),
std::back_inserter(range));
std::copy(range.begin(), range.end(),
std::ostream_iterator<Log>(std::cout, "\n"));
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxmc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL2dyZWdvcmlhbi9ncmVnb3JpYW4uaHBwPgoKc3RydWN0IExvZwp7CiAgICB0eXBlZGVmIGJvb3N0OjpncmVnb3JpYW46OmRhdGUgRGF0ZTsKICAgIERhdGUgZGF0ZTsKICAgIGludCBpbmZvOwp9OwoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBMb2cmIGwpCnsKICAgIHJldHVybiBvcyA8PCBsLmRhdGUgPDwgIiAiIDw8IGwuaW5mbzsKfQoKc3RkOjppc3RyZWFtJiBvcGVyYXRvciA+PihzdGQ6OmlzdHJlYW0mIGlzLCBMb2cmIGwpCnsKICAgIHJldHVybiBpcyA+PiBsLmRhdGUgPj4gbC5pbmZvOwp9CgpMb2cgTG93ZXJCb3VuZChzdGQ6OmlzdHJlYW0mIG9zLCBMb2c6OkRhdGUgZCkKewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIG9zLnNlZWtnKDAsIHN0ZDo6aW9zOjplbmQpOwogICAgc3RyZWFtb2ZmIGxlbmd0aCA9IG9zLnRlbGxnKCk7CiAgICBzdHJlYW1wb3MgY3VycmVudCA9IDA7CiAgICBMb2cgbDsKICAgIGZvcig7IGxlbmd0aCA+IDA7KQogICAgewogICAgICAgIHN0cmVhbW9mZiBoYWxmID0gbGVuZ3RoIC8gMjsKICAgICAgICBzdHJlYW1wb3MgbWlkID0gY3VycmVudCArIGhhbGY7CiAgICAgICAgb3Muc2Vla2cobWlkKTsKCiAgICAgICAgc3RyaW5nIGxpbmU7CiAgICAgICAgZ2V0bGluZShvcywgbGluZSk7CiAgICAgICAgCiAgICAgICAgaWYgKCEob3MgPj4gbC5kYXRlID4+IGwuaW5mbykpCiAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiYmFkIGxvZyBmb3JtYXQiKTsKICAgICAgICBpZiAobC5kYXRlIDwgZCkKICAgICAgICB7CiAgICAgICAgICAgIG1pZCArPSAxOwogICAgICAgICAgICBjdXJyZW50ID0gbWlkOwogICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggLSBoYWxmICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBsZW5ndGggPSBoYWxmOwogICAgfQogICAgcmV0dXJuIGw7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIE91dEl0ZXI+CnZvaWQgUmVhZExvZ3NJblJhbmdlKAogICAgc3RkOjppc3RyZWFtJiBsb2dTdHJlYW0sIExvZzo6RGF0ZSBmcm9tLCBMb2c6OkRhdGUgdG8sIE91dEl0ZXIgb3V0KQp7CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIExvZyBsID0gTG93ZXJCb3VuZChsb2dTdHJlYW0sIGZyb20pOwogICAgKm91dCsrID0gbDsKICAgIC8vIFVwcGVyIEJvdW5kCiAgICB3aGlsZShsb2dTdHJlYW0gPj4gbCAmJiBsLmRhdGUgPCB0bykKICAgICAgICAqb3V0KysgPSBsOwp9CgoKaW50IG1haW4oKQp7CiAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OmdyZWdvcmlhbjsKICAgIAogICAgLy8gQ3JlYXRlIGxvZwogICAgTG9nIGw7CiAgICBsLmRhdGUgPSBMb2c6OkRhdGUoMjAxMSwgU2VwLCAxKTsKICAgIGwuaW5mbyA9IDE7CgogICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOwogICAgZm9yKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKICAgIHsKICAgICAgICBsb2cgPDwgbCA8PCBzdGQ6OmVuZGw7CiAgICAgICAgbC5kYXRlICs9IGRheXMoMSk7CiAgICAgICAgKytsLmluZm87CiAgICB9CgogICAgLy8gUmVhZCB0aGUgbG9nCiAgICBzdGQ6OnZlY3RvcjxMb2c+IHJhbmdlOwogICAgUmVhZExvZ3NJblJhbmdlKGxvZywgCiAgICAgICAgZGF0ZSgyMDExLCBTZXAsIDkpLCBkYXRlKDIwMTEsIFNlcCwgMTIpLCAKICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIocmFuZ2UpKTsKCiAgICBzdGQ6OmNvcHkocmFuZ2UuYmVnaW4oKSwgcmFuZ2UuZW5kKCksIAogICAgICAgIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxMb2c+KHN0ZDo6Y291dCwgIlxuIikpOwp9