void build_(int (&vs_)[MAXN], int x, int l, int r) { if(l == r) st[x] = vs_[l]; else { build_(vs_, cl(x), l, (l + r) / 2); build_(vs_, cr(x), (l + r) / 2 + 1, r); st[x] = max(st[cl(x)], st[cr(x)]); } }
int Fujimap::build(){ for (map<string, uint64_t>::const_iterator it = tmpEdges_.begin(); it != tmpEdges_.end(); ++it){ uint64_t id = getBlockID(it->first.c_str(), it->first.size()); kf_.write(id, it->first.c_str(), it->first.size(), it->second); } tmpEdges_.clear(); vector<FujimapBlock> cur; for (uint64_t i = 0; i < keyBlockN_; ++i){ vector<pair<string, uint64_t> > kvs; if (kf_.read(i, kvs) == -1){ what_ << "kf read error" << endl; return -1; } FujimapBlock fb; if (build_(kvs, fb) == -1){ return -1; } cur.push_back(fb); } kf_.clear(); fbs_.push_back(cur); return 0; }
void build(int (&vals_)[MAXN], int n_) { n = n_; build_(vals_, 1, 0, n - 1); }