Submission #1313331

#TimeUsernameProblemLanguageResultExecution timeMemory
1313331nicolo_010Fire (JOI20_ho_t5)C++20
6 / 100
184 ms36040 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define f first #define s second vector<int> a; struct SegTree { struct Node { int L=-1, R=-1; int val=0; }; vector<Node> tree; SegTree(int n) { tree.reserve(20*n); build(0, n-1); } int build(int l, int r) { tree.push_back({}); int p = tree.size()-1; if (l==r) { tree[p].val = a[l]; return p; } int m = (l+r)/2; int i1 = build(l, m); int i2 = build(m+1, r); tree[p].val = tree[i1].val + tree[i2].val; tree[p].L = i1; tree[p].R = i2; return p; } int update(int p, int l, int r, int i) { tree.push_back(tree[p]); int cur = tree.size()-1; if (l==r) { tree[cur].val = tree[p].val+1; return cur; } int m = (l+r)/2; if (i<=m) { tree[cur].L = update(tree[p].L, l, m, i); } else { tree[cur].R = update(tree[p].R, m+1, r, i); } int i1 = tree[cur].L; int i2 = tree[cur].R; tree[cur].val = tree[i1].val + tree[i2].val; return cur; } int rsq(int p, int l, int r, int i, int j) { if (l > j || r < i) return 0; if (i <= l && r <= j) return tree[p].val; int m = (l+r)/2; int i1 = rsq(tree[p].L, l, m, i, j); int i2 = rsq(tree[p].R, m+1, r, i, j); return i1+i2; } }; int main() { ios::sync_with_stdio(false); cin.tie(NULL); int n, q; cin >> n >> q; a.assign(n, 0); for (int i=0; i<n; i++) { cin >> a[i]; } SegTree st(n); vector<vector<int>> ti(n+1); vector<int> root(n+1); root[0] = 0; vector<int> last(n, -1); if (a[0]==2) last[0] = 0; for (int i=1; i<n; i++) { if (a[i]==2) last[i] = i; else last[i] = last[i-1]; if (last[i] != -1) ti[i-last[i]].push_back(i); } for (int t=1; t<=n; t++) { int r=root[t-1]; for (auto x : ti[t]) { r = st.update(r, 0, n-1, x); } root[t] = r; } while (q--) { int t, l, r; cin >> t >> l >> r; l--; r--; cout << st.rsq(root[t], 0, n-1, l, r) << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...