void CDQ(int nl, int nr) { if(nl>=nr) return; int mid=(nl+nr)>>1; CDQ(nl, mid); CDQ(mid+1,nr); int tl=mid; for(int tr=nr; tr>mid; tr--) { while(tl>=nl && arry[tl].l >= arry[tr].l) { bit.add( arry[tl].r, arry[tl].v); tl--; } ans[ arry[tr].t ] += bit.sum( arry[tr].r ); } for(int i=mid; i>tl; i--) bit.add( arry[i].r, -arry[i].v); tl=nl; int tp=nl; for(int tr=mid+1; tr<=nr; tr++) { while(tl<=mid && arry[tl].l < arry[tr].l) temp[tp++] = arry[tl++]; temp[tp++] = arry[tr]; } while(tl<=mid) temp[tp++] = arry[tl++]; for(int i=nl; i<=nr; i++) arry[i]=temp[i]; }
inline void Work(void) { T.clear(); T.Add(b[1], 1); int j = 0; last = 1; for (int i = 2; i <= m; i++) { while (j && Ask(b, i - j, b[i]) != rank[j + 1]) j = p[j]; if (j == 0) Ask(b, i - j, b[i]); if (Ask(b, i - j, b[i]) == rank[j + 1]) j++; p[i] = j; T.Add(b[i], 1); } T.clear(); j = 0; last = 1; for (int i = 1; i <= n; i++) { while (j && Ask(a, i - j, a[i]) != rank[j + 1]) j = p[j]; if (j == 0) Ask(a, i - j, a[i]); if (Ask(a, i - j, a[i]) == rank[j + 1]) j++; if (j == m) { Ans[i] = true; j = p[j]; } T.Add(a[i], 1); } f[0] = 0; for (int i = 1; i <= n; i++) { // printf("%d ", Ans[i]); f[i] = f[i - 1]; if (Ans[i] > 0) f[i] = max(f[i], f[i - m] + 1); } // puts(""); printf("%d\n", f[n]); }
inline void Prepare(void) { T.clear(); T.n = MAXH; for (int i = 1; i <= m; i++) { rank[i] = make_pair(T.Cal(b[i] - 1) + 1, T.Cal(b[i])); T.Add(b[i], 1); } }
void solve() { ll ans = 0; BIT b; for (int j = 0; j < n; j++) { ans += j - b.sum(b.a[j]); } }
void add(int x, int c) { assert(!col[c].count(x)); int a = prv(x, c); int b = nxt(x, c); if (a != -1) { bit.del(a, b); bit.add(a, x); } bit.add(x, b); col[c].insert(x); }
void del(int x, int c) { assert(col[c].count(x)); int a = prv(x, c); int b = nxt(x, c); bit.del(x, b); if (a != -1) { bit.del(a, x); bit.add(a, b); } col[c].erase(x); }
void HLD::update(int x, int y) { while(ntop[x] != ntop[y]) { if( dept[ ntop[x] ] > dept[ ntop[y] ] ) swap(x,y); bit.update( dfsn[ ntop[y] ], dfsn[ y ], 1); y = fath[ ntop[y] ]; } if( dept[x] > dept[y] ) swap(x,y); x = bson[x]; bit.update( dfsn[x], dfsn[y], 1); }
int main() { ios::sync_with_stdio(false); int n = 10; int i, x; BIT T; while(cin >> i >> x){ T.increment(i,x); FOR1(j,n) cout << T.read(j) << ' '; cout << endl; } return 0; }
long long kth_smallest(long long k){ long long lo = 0, hi = tree.size()-1; long long mid = -1; while(lo < hi){ mid = (lo + hi)/2; if(k <= tree.get_sum(mid)) hi = mid; else lo = mid + 1; } //cerr << "sum up to " << lo << " is " << tree.get_sum(lo) << endl; if(tree.get_sum(lo) < k) return -1; return lo; }
int main(void){ int T; scanf("%d", &T); while(T--) { scanf("%d", &n); int maxa = 0; for(int i = 1; i <= n; i++) { scanf("%d", a+i); maxa = maxa > a[i] ? maxa: a[i]; } BIT t; t.resize(maxa); t.clear(); for(int i = 1; i <= n; i++) { t.add(a[i], 1); c[i] = t.sum(a[i] - 1); } t.clear(); for(int i = n; i > 0; i--) { t.add(a[i], 1); d[i] = t.sum(a[i] - 1); } long long ans = 0; for(int i = 1; i <= n; i++) { ans += (long long)c[i]*(n-i-d[i]) + (long long)(i-c[i]-1)*d[i]; } printf("%lld\n", ans); } return 0; }
int main () { int n, x, y; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d %d", &x, &y); freq[tree.cnt(x+1)]++; tree.inc(x+1); } for (int i = 0; i < n; i++) { printf("%d\n", freq[i]); } }
void solve(){ if(!len){ puts("Poor stack!"); return; } b = BIT(ns); rep(i,ns) b.add(i,1); rep(i,ms){ for(int j = k[i]-1; j >= 0; --j){ int pos = b.find(a[j]); b.add(pos,-1); } } rep(i,ns) if(b.sum(i,i+1)) printf("%d", seq[i]); puts(""); }
int main() { int C = 0, T, q, x, y; scanf("%d", &T); while (++C <= T) { bit.init(); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &x); bit.modify(i, x); } scanf("%d", &q); while (q--) { scanf("%d %d", &x, &y); printf("%d\n", bit.query(x, y)); } } }
int main() { ios_base::sync_with_stdio(false); int n, m, k; int x, y; cin >> n >> m >> k; op.init(m+10); a.init(n+10); for (int i=1; i<=n; ++i) { cin >> x; a.add_interval(i, i, x); } for (int i=1; i<=m; ++i) cin >> l[i] >> r[i] >> d[i]; for (int i=0; i<k; ++i) { cin >> x >> y; op.add_interval(x, y, 1); } for (int i=1; i<=m; ++i) a.add_interval(l[i], r[i], op.sum(i)*d[i]); for (int i=1; i<=n; ++i) cout << a.sum(i) << (i < n ? " " : "\n"); return 0; }
int main(){ ios_base::sync_with_stdio(0); cin.tie(0); //freopen("d.in", "r", stdin); cin >> T; while (T--){ cin >> N; for (int i = 1 ; i <= N ; i++){ cin >> A[i]; B[i] = A[i]; } sort(B + 1, B + N + 1); for (int i = 1 ; i <= N ; i++) ID[i] = lower_bound(B + 1, B + N + 1, A[i]) - B; S[N + 1] = 0; for (int i = N ; i >= 1 ; i--){ S[i] = 1; if (ID[i] < ID[i + 1]) S[i] += S[i + 1]; } int sol = 0; BIT bit; for (int i = 1 ; i <= N ; i++){ D[i] = 1; if (ID[i] > ID[i - 1]) D[i] += D[i - 1]; bit.update(ID[i], D[i]); int s = S[i] + bit.query(ID[i] - 1); if (sol < s) sol = s; } cout << sol << '\n'; } return 0; }
void init(Graph *g) { G=g; bit.init(G->ndn); dfst=0; dept[1] = 0; fath[1] = 0; CLR(dfsn); CLR(bson); CLR(ntop); dfs1(1); dfs2(1,1); }
int main() { while (~sf("%d", &n)) { REP(i, n) { sf("%s", op[i]); if (op[0] == 'D' || op[0] == 'Q') { sf("%d%d", &seg[i][0], &seg[i][1]); b.pb(seg[i][0]); b.pb(seg[i][1]); } else { sf("%d", &seg[i][0]); b.pb(seg[i][0]); } } sort(all(b)); b.resize(unique(all(b))-b.begin()); le.init(b.size()); ri.init(b.size()); }
int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif int T; scanf("%d", &T); for(int ck=1; ck<=T; ck++) { scanf("%d", &Q); D.siz=0; CLR(ans); int scnt=0; for(int i=1; i<=Q; i++) { int opt,l,r; scanf("%d%d", &opt, &l); arry[i].t=i; if(!opt) { scanf("%d", &r); scnt++; inpt[scnt][0] = l; inpt[scnt][1] = r; inpt[scnt][2] = i; arry[i].l = l; arry[i].r = r; arry[i].v = 1; D.add(l); D.add(r); } else { arry[i].l = inpt[l][0]; arry[i].r = inpt[l][1]; arry[i].v = -1; } } D.init(); bit.init(D.siz); for(int i=1; i<=Q; i++) { arry[i].l = D.id(arry[i].l); arry[i].r = D.id(arry[i].r); } CDQ(1,Q); for(int i=1; i<=scnt; i++) printf("%d\n", ans[ inpt[i][2] ]); } return 0; }
int dfs(int c, int k) { int iv = bit.sum(1000) - bit.sum(vertex[c]); if (k <= 1) { return iv; } visited[c] = 1; bit.add(vertex[c], 1); int res = 1 << 30; if (k > 1) { for (int v : edge[c]) { if (!visited[v]) { res = min(res, iv + dfs(v, k - 1)); } } } bit.add(vertex[c], -1); visited[c] = 0; return res; }
int main() { int x, r, h; int a, b; scanf("%d%d", &N, &Q); bit.init(MAX_X + MAX_H); for (int i = 0; i < N; i++) { scanf("%d%d%d", &x, &r, &h); for (int j = 0; j < h; j++) { bit.add(x + j + 1, (double)r * r * M_PI * h * 1.0/3.0 * (pow(h - j, 3) - pow(h - j - 1, 3)) / pow(h, 3)); } } for (int i = 0; i < Q; i++) { scanf("%d%d", &a, &b); ans = bit.sum(b) - bit.sum(a); printf("%lf\n", ans); } return 0; }
int getMinimumInversions(vector <int> A, vector <int> B, vector <int> V, int K) { n = (int)A.size(); edge = IVV(n); vertex = V; for (int i = 0; i < n; ++i) { edge[A[i]].push_back(B[i]); edge[B[i]].push_back(A[i]); } int ans = 1e6; for (int i = 0; i < n; ++i) { memset(visited, 0, sizeof(visited)); bit.init(1001); ans = min(ans, dfs(i, K)); } return (ans < 1e6) ? ans : -1; }
int calc(int p) { printf("calc(%d)\n", p); int cnt[20]; memset(cnt, 0, sizeof cnt); int max_power = 0; memset(power, 0, sizeof power); for(int i = 0; i < n; i++) { int num = v[i]; while(num % p == 0) { power[i]++; num /= p; } cnt[power[i]]++; max_power = max(max_power, power[i]); } printf("max_power=%d ", max_power); bit.init(); for(int i = 1; i <= max_power; i++) { bit.add(i, cnt[i]); } int ans = 0; int cur = p; int base[20]; for(int i = 1; cur <= maxa; i++) { base[i] = cur; cur = (cur * 1LL * p) % mod; } for(int i = 0; i < n; i++) { if(power[i] == 0) continue; printf("total(%d - %d)=%d ", bit.sum(max_power), bit.sum(power[i] - 1), total(bit.sum(max_power) - bit.sum(power[i] - 1))); ans = (ans + (base[power[i]] * 1LL * total(bit.sum(max_power) - bit.sum(power[i] - 1))) % mod) % mod; printf("i=%d ans=%d ", i, ans); for(int j = power[i] - 1; j >= 1; j--) { ans = (ans + (base[j] * 1LL * total(cnt[j])) % mod) % mod; printf("cnt[%d]=%d ans=%d ", j, cnt[j], ans); } printf("ans=%d\n", ans); cnt[power[i]]--; bit.add(power[i], -1); } return ans; }
int main(void){ ios::sync_with_stdio(false); cin.tie(NULL); long long n; cin >> n; char op[n]; long long val[n]; for(long long i = 0; i < n; i++) cin >> op[i] >> val[i]; vector<long long> orig(val, val+n); sort(val, val+n); unordered_map<long long, long long> value, reval; long long cur = 1; value[val[0]] = cur; reval[cur] = val[0]; for(long long i = 1; i < n; i++){ if(val[i] == val[i-1]) continue; else { value[val[i]] = ++cur; reval[cur] = val[i]; } } for(long long i = 0; i < n; i++) orig[i] = value[orig[i]]; //for(long long i = 0; i < n; i++) cerr << orig[i] << endl; tree.build(n+2); for(long long i = 0; i < n; i++){ if(op[i] == 'I'){ //cerr << "inserting: " << orig[i] << endl; insert(orig[i]); }else if(op[i] == 'D'){ //cerr << "deleting: " << orig[i] << endl; erase(orig[i]); }else if(op[i] == 'K'){ long long ans = kth_smallest(reval[orig[i]]); //cerr << "Kth: " << reval[orig[i]] << endl; if(ans == -1) cout << "invalid" << endl; else cout << reval[ans] << endl; }else{ long long ans = Rank(orig[i]); //cerr << "Count" << endl; cout << ans << endl; } //tree.prlong long(); } }
int main(int argc, const char * argv[]) { int ff; int v1, v2, t; char query[20]; BIT bit; scanf("%d", &ff); for (int tt = 1; tt <= ff; tt++) { printf("Case %d:\n", tt); int n; scanf("%d", &n); bit.build(n+1); for (int i = 1; i <= n; i++) { scanf("%d", &t); bit.modify(i, t); } bool fl = true; while (fl) { scanf("%s", query); switch (query[0]) { case 'Q': scanf("%d %d", &v1, &v2); printf("%d\n", bit.sum(v1, v2)); break; case 'A': scanf("%d %d", &v1, &v2); bit.modify(v1, v2); break; case 'S': scanf("%d %d", &v1, &v2); bit.modify(v1, -v2); break; case 'E': fl = false; break; } } } }
long long Rank(long long n){ return tree.get_sum(n-1); }
int HLD::query(int x) { return bit.query( dfsn[x] ); }
inline pair<int, int> Ask(int a[], int L, int t) { while (last < L) T.Add(a[last++], -1); return make_pair(T.Cal(t - 1) + 1, T.Cal(t)); }
int query(int l, int r) { // cout << bit.query(r,r) << " " << bit.query(l-1,r) << endl; return bit.query(r, r) - bit.query(l-1, r); }
void init() { bit.init(); REP(i,MXN) col[i].clear(); }
int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; ++i) { int s; scanf("%d", &s); sect[s].push_back(i); } for (int i = 1; i <= n; ++i) scanf("%d", &need[i]); scanf("%d", &k); for (int q = 0; q < k; ++q) { scanf("%d%d%d", &l[q], &r[q], &a[q]); } for (int i = 1; i <= n; ++i) { lo[i] = 0; hi[i] = k; } BIT bit; while (!terminated()){ // clear tree bit.reset(); // generate new check for (int i = 1; i <= n; ++i) { int mid = (lo[i]+hi[i])/2; check[mid].push_back(i); } for (int q = 0; q < k; ++q) { // apply query if (l[q] <= r[q]) { bit.update(l[q], a[q]); bit.update(r[q]+1, -a[q]); } else { bit.update(l[q], a[q]); bit.update(1, a[q]); bit.update(r[q]+1, -a[q]); } // check for (auto &v: check[q]) { long long sum = 0; for (auto &s: sect[v]) { sum += bit.query(s); if (sum >= need[v]) break; } if (sum >= need[v]) { hi[v] = q; } else { lo[v] = q+1; } } check[q].clear(); } } for (int i = 1; i <= n; ++i) { if (lo[i] < k) printf("%d\n", lo[i]+1); else puts("NIE"); } return 0; }