int main() { int n, m, l, r; set<pair<int, int> > st; scanf("%d%d", &n, &m); scanf("%s", buf); sa.init(n, buf); rmq.init(n, sa.height); l = 0; r = 1; for (int i = 0; i < m; ++i) { scanf("%s", op); int& t = op[0] == 'L' ? l : r; t += op[1] == '+' ? 1 : -1; int k = sa.rank[l]; int lo = 0, hi = k; while (lo < hi) { int mi = (lo + hi) / 2; if (rmq.value(mi + 1, k + 1) >= r - l) { hi = mi; } else { lo = mi + 1; } } st.insert(make_pair(hi, r - l)); } printf("%d\n", (int)st.size()); return 0; }
int main(){ int n, ans; cin >> n; RMQ r; r.init(n); for(int j=0;j<n;j++){ cin >> a[j]; r.update(j,-a[j]); } for(int x=0;x<n;x++){ int head = 0,tail = x,now; ans = 0; while(head != tail && x > 0){ now = (head + tail)/2; //cout << x << "-L:" << head << " " << tail << " " << now << " " << r.query(now,x) << endl;// if(r.query(now,x)>=-a[x])tail=now; else head=now+1; } ans += x - head; head = x,tail = n-1; while(head != tail && x < n-1){ now = (head + tail+1)/2; //cout << x << "-R:" << head << " " << tail << " " << now << " " << r.query(x,now) << endl;// if(r.query(x,now)>=-a[x])head=now; else tail=now-1; } ans += head - x; cout << ans << endl; } return 0; }
void solve4(RMQ& rmq, vector<int>& FIRE, int N, int P){ for (int i = P; i < N; i++){ int start = i - P; int end = i - 1; FIRE[i] += rmq.query(start, end); rmq.update(i, FIRE[i]); } }
REP(i, m) { int s = sorters[i].first; int t = sorters[i].second; int minLength = rmq.query(s-1, t); //dp[t] = min(minLength + 1, dp[t]); int next = min(minLength + 1, rmq.query(t-1, t)); rmq.update(t-1, next); }
int main () { vector<int> a (10); for (int i = 0; i < 10; ++i) a[i] = i; RMQ x (a); cout << x.getMin (5, 7); return 0; }
int test() { PhraseMap pm; pm.insert(1, "duckduckgo", ""); pm.insert(2, "duckduckgeese", ""); pm.insert(1, "duckduckgoose", ""); pm.insert(9, "duckduckgoo", ""); pm.insert(10, "duckgo", ""); pm.insert(3, "dukgo", ""); pm.insert(2, "luckkuckgo", ""); pm.insert(5, "chuckchuckgo", ""); pm.insert(15, "dilli - no one killed jessica", ""); pm.insert(11, "aaitbaar - no one killed jessica", ""); pm.finalize(); RMQ st; vui_t weights; for (size_t i = 0; i < pm.repr.size(); ++i) { weights.push_back(pm.repr[i].weight); } st.initialize(weights); cout<<"\n"; cout<<"suggest(\"d\"):\n"<<suggest(pm, st, "d")<<endl; cout<<"naive_suggest(\"d\"):\n"<<naive_suggest(pm, st, "d")<<endl; cout<<"\n"; cout<<"suggest(\"a\"):\n"<<suggest(pm, st, "a")<<endl; cout<<"naive_suggest(\"a\"):\n"<<naive_suggest(pm, st, "a")<<endl; cout<<"\n"; cout<<"suggest(\"b\"):\n"<<suggest(pm, st, "b")<<endl; cout<<"naive_suggest(\"b\"):\n"<<naive_suggest(pm, st, "b")<<endl; cout<<"\n"; cout<<"suggest(\"duck\"):\n"<<suggest(pm, st, "duck")<<endl; cout<<"naive_suggest(\"duck\"):\n"<<naive_suggest(pm, st, "duck")<<endl; cout<<"\n"; cout<<"suggest(\"k\"):\n"<<suggest(pm, st, "k")<<endl; cout<<"naive_suggest(\"k\"):\n"<<naive_suggest(pm, st, "k")<<endl; cout<<"\n"; cout<<"suggest(\"ka\"):\n"<<suggest(pm, st, "ka")<<endl; cout<<"naive_suggest(\"ka\"):\n"<<naive_suggest(pm, st, "ka")<<endl; cout<<"\n"; cout<<"suggest(\"c\"):\n"<<suggest(pm, st, "c")<<endl; cout<<"naive_suggest(\"c\"):\n"<<naive_suggest(pm, st, "c")<<endl; return 0; }
vp_t suggest(PhraseMap &pm, RMQ &st, std::string prefix, uint_t n = 16) { pvpi_t phrases = pm.query(prefix); // cerr<<"Got "<<phrases.second - phrases.first<<" candidate phrases from PhraseMap"<<endl; uint_t first = phrases.first - pm.repr.begin(); uint_t last = phrases.second - pm.repr.begin(); if (first == last) { return vp_t(); } vp_t ret; --last; pqpr_t heap; pui_t best = st.query_max(first, last); heap.push(PhraseRange(first, last, best.first, best.second)); while (ret.size() < n && !heap.empty()) { PhraseRange pr = heap.top(); heap.pop(); // cerr<<"Top phrase is at index: "<<pr.index<<endl; // cerr<<"And is: "<<pm.repr[pr.index].first<<endl; ret.push_back(pm.repr[pr.index]); uint_t lower = pr.first; uint_t upper = pr.index - 1; // Prevent underflow if (pr.index - 1 < pr.index && lower <= upper) { // cerr<<"[1] adding to heap: "<<lower<<", "<<upper<<", "<<best.first<<", "<<best.second<<endl; best = st.query_max(lower, upper); heap.push(PhraseRange(lower, upper, best.first, best.second)); } lower = pr.index + 1; upper = pr.last; // Prevent overflow if (pr.index + 1 > pr.index && lower <= upper) { // cerr<<"[2] adding to heap: "<<lower<<", "<<upper<<", "<<best.first<<", "<<best.second<<endl; best = st.query_max(lower, upper); heap.push(PhraseRange(lower, upper, best.first, best.second)); } } return ret; }
int main(){ cin.tie(0); ios::sync_with_stdio(false); ll n,q,c,x,y; RMQ rmq; cin >> n >> q; rmq.init(n); rep(i,q){ cin >> c >> x >> y; if(c == 0){ rmq.update(x,y); } else{ cout << rmq.query(x,y) << endl; } }
bool query(int l, int r) { int updowns = qs[r] - qs[l] - abs(middle[r] - middle[l]); int ups, summit; int ups_min, downs_min; if (updowns < 0) { return false; } if (updowns % 2 != 0) { return false; } ups = updowns / 2 + max(0, middle[l] - middle[r]); summit = max((int)(lower_bound(qs+ l, qs + r, qs[l] + ups) - qs), l); ups_min = highs.query(l, summit + 1); downs_min = lows.query(summit + 1, r + 1); return (ups_min == INF || ups_min == highs.query(l, l + 1)) && (downs_min == INF || downs_min == lows.query(r, r + 1)); }
int lca(int i, int j) { i = u[i]; j = u[j]; if (i > j) { swap(i, j); } return j2i[rmq.value(i, j + 1)]; }
ll without(RMQ<pii>& minxrmq, RMQ<pii>& minyrmq, RMQ<pii>& maxxrmq, RMQ<pii>& maxyrmq, int l, int r, int excluded) { pii minx = min(minxrmq.query(l, excluded), minxrmq.query(excluded + 1, r)); pii miny = min(minyrmq.query(l, excluded), minyrmq.query(excluded + 1, r)); pii maxx = min(maxxrmq.query(l, excluded), maxxrmq.query(excluded + 1, r)); pii maxy = min(maxyrmq.query(l, excluded), maxyrmq.query(excluded + 1, r)); ll dx = (-maxx.first - minx.first); ll dy = (-miny.first - maxy.first); return max(dx, dy); }
// should be called after initilizaing phrase map size_t initialize_RMQ() { vui_t weights; for (size_t i = 0; i < pm.repr.size(); ++i) { weights.push_back(pm.repr[i].weight); } st.initialize(weights); return weights.size(); }
long long query(int delta_t, T delta_v){ // only positive deltas assert (delta_t > 0); ans = 0; int n = seq.size(); // this loop fix each possible beginning // and checks inside it if it is valid for (int i = 0; i < seq.size(); ++i){ int m = rmqMax->query(i, (i + delta_t < n )? (i+delta_t): n - 1); if (seq[m] - seq[i] >= delta_v) ++ans; } return ans; }
int main() { int high, low; int l, r; scanf("%d", &N); scanf("%s", S + 1); highs.init(N + 1); lows.init(N + 1); high = 0; low = 0; highs.update(0, 0); lows.update(0, 0); middle[0] = 0; qs[0] = 0; for (int i = 1; i <= N; i++) { middle[i] = middle[i - 1]; qs[i] = qs[i - 1]; switch(S[i]) { case '(': high++; low++; middle[i]++; break; case ')': high--; low--; middle[i]--; break; case '?': high++; low--; qs[i]++; break; } highs.update(i, high); lows.update(i, low); } scanf("%d", &Q); for (int q = 0; q < Q; q++) { scanf("%d%d", &l, &r); l--; printf("%s\n", query(l, r) ? "Yes" : "No"); } return 0; }
int main() { int re, n, a, b, c; scanf("%d", &re); for (int ri = 1; ri <= re; ++ri) { scanf("%d", &n); for (int i = 0; i < n; ++i) { e[i].clear(); v[i] = w[i] = 0; } for (int i = 1; i < n; ++i) { scanf("%d%d", &a, &b); e[a].push_back(b); e[b].push_back(a); } m = rmq.n = 0; dfs(0); rmq.init(); scanf("%d", &m); fill(v, v + n, 0); fill(w, w + n, 0); for (int i = 0; i < m; ++i) { scanf("%d%d%d", &a, &b, &c); v[a] += c; v[b] += c; w[lca(a, b)] += c; } gao(0); printf("Case #%d:\n", ri); for (int i = 0; i < n; ++i) { printf("%d\n", v[i] - w[i]); } } return 0; }
int query(int u, int v){ if(H[v] < H[u])swap(u,v); return E[rmq.query(H[u],H[v])]; }
// this heuristic preprocessing is // simple, since it only needs a RMQ structure void preprocess(vector<T>& A) { seq = A; // we want a max RMQ, so the 'greater' argument rmqMax->preprocess(seq); }
string get_name(){ return "Beg-RMQ(" + rmqMax->name() + ")"; }
int do_import(std::string file, uint_t limit, int &rnadded, int &rnlines) { bool is_input_sorted = true; #if defined USE_CXX_IO std::ifstream fin(file.c_str()); #else FILE *fin = fopen(file.c_str(), "r"); #endif int fd = open(file.c_str(), O_RDONLY); DCERR("handle_import::file:" << file << "[fin: " << (!!fin) << ", fd: " << fd << "]" << endl); if (!fin || fd == -1) { perror("fopen"); return -IMPORT_FILE_NOT_FOUND; } else { building = true; int nlines = 0; int foffset = 0; if (if_mmap_addr) { int r = munmap(if_mmap_addr, if_length); if (r < 0) { perror("munmap"); building = false; return -IMPORT_MUNMAP_FAILED; } } // Potential race condition + not checking for return value if_length = file_size(file.c_str()); // mmap() the input file in if_mmap_addr = (char*)mmap(NULL, if_length, PROT_READ, MAP_SHARED, fd, 0); if (if_mmap_addr == MAP_FAILED) { fprintf(stderr, "length: %llu, fd: %d\n", if_length, fd); perror("mmap"); if (fin) { fclose(fin); } if (fd != -1) { close(fd); } building = false; return -IMPORT_MMAP_FAILED; } pm.repr.clear(); char buff[INPUT_LINE_SIZE]; std::string prev_phrase; while (!is_EOF(fin) && limit--) { buff[0] = '\0'; int llen = -1; get_line(fin, buff, INPUT_LINE_SIZE, llen); if (llen == -1) { break; } ++nlines; int weight = 0; std::string phrase; StringProxy snippet; InputLineParser(if_mmap_addr, foffset, buff, &weight, &phrase, &snippet).start_parsing(); foffset += llen; if (!phrase.empty()) { str_lowercase(phrase); DCERR("Adding: " << weight << ", " << phrase << ", " << std::string(snippet) << endl); pm.insert(weight, phrase, snippet); } if (is_input_sorted && prev_phrase <= phrase) { prev_phrase.swap(phrase); } else if (is_input_sorted) { is_input_sorted = false; } } DCERR("Creating PhraseMap::Input is " << (!is_input_sorted ? "NOT " : "") << "sorted\n"); fclose(fin); pm.finalize(is_input_sorted); vui_t weights; for (size_t i = 0; i < pm.repr.size(); ++i) { weights.push_back(pm.repr[i].weight); } st.initialize(weights); rnadded = weights.size(); rnlines = nlines; building = false; } return 0; }
int commonPrefix(SA &sa, RMQ &rmq, int p1, int p2){ p1 = sa.rnk[p1]; p2 = sa.rnk[p2]; if (p1 > p2) swap(p1, p2); return rmq.query(p1, p2 - 1); }
int do_import(std::string file, int sorted, uint_t limit, int &rnadded, int &rnlines) { #if defined USE_CXX_IO std::ifstream fin(file.c_str()); #else FILE *fin = fopen(file.c_str(), "r"); #endif int fd = open(file.c_str(), O_RDONLY); // Potential race condition + not checking for return value if_length = file_size(file.c_str()); DCERR("handle_import::file:"<<file<<endl); if (!fin || !fd) { return -IMPORT_FILE_NOT_FOUND; } else { building = true; int nlines = 0; int foffset = 0; if (if_mmap_addr) { munmap(if_mmap_addr, if_length); } // mmap() the input file in if_mmap_addr = (char*)mmap(NULL, if_length, PROT_READ, MAP_SHARED, fd, 0); if (!if_mmap_addr) { fclose(fin); close(fd); return -IMPORT_FILE_NOT_FOUND; } pm.repr.clear(); char buff[INPUT_LINE_SIZE]; while ( #if defined USE_CXX_IO fin #else !feof(fin) #endif && limit--) { buff[0] = '\0'; #if defined USE_CXX_IO fin.getline(buff, INPUT_LINE_SIZE); const int llen = fin.gcount(); buff[INPUT_LINE_SIZE - 1] = '\0'; #else char *got = fgets(buff, INPUT_LINE_SIZE, fin); if (!got) { break; } const int llen = strlen(buff); if (llen && buff[llen-1] == '\n') { buff[llen-1] = '\0'; } #endif ++nlines; int weight = 0; std::string phrase; StringProxy snippet; InputLineParser(if_mmap_addr, foffset, buff, &weight, &phrase, &snippet).start_parsing(); foffset += llen; if (!phrase.empty()) { str_lowercase(phrase); DCERR("Adding: "<<weight<<", "<<phrase<<", "<<std::string(snippet)<<endl); pm.insert(weight, phrase, snippet); } } fclose(fin); pm.finalize(sorted); vui_t weights; for (size_t i = 0; i < pm.repr.size(); ++i) { weights.push_back(pm.repr[i].weight); } st.initialize(weights); rnadded = weights.size(); rnlines = nlines; building = false; } return 0; }
void build(vvi & children){ idx = 0; memset(H, -1, sizeof H); dfs(0, 0, children); rmq.build(idx,L); }