Submission #1259362

#TimeUsernameProblemLanguageResultExecution timeMemory
1259362IrateBridges (APIO19_bridges)C++20
0 / 100
300 ms589824 KiB
#include <bits/stdc++.h> using namespace std; struct SegmentTree{ vector<int>sTree; SegmentTree(int n){ sTree.resize(4 * n); } void Build(int node, int l, int r, vector<int>&v){ if(l == r){ sTree[node] = v[l]; } else{ int mid = (l + r) / 2; Build(node * 2, l, mid, v); Build(node * 2 + 1, mid + 1, r, v); sTree[node] = min(sTree[node * 2], sTree[node * 2 + 1]); } } void Update(int node, int l, int r, int pos, int val){ if(l == r){ sTree[node] = val; } else{ int mid = (l + r) / 2; if(pos <= mid){ Update(node * 2, l, mid, pos, val); } else{ Update(node * 2 + 1, mid + 1, r, pos, val); } sTree[node] = min(sTree[node * 2], sTree[node * 2 + 1]); } } int Query1(int node, int l, int r, int ql, int qr, int w){ int mid = (l + r) / 2; if(ql <= l && r <= qr){ if(l == r){ if(sTree[node] < w)return l; else return -1; } else{ if(sTree[node * 2] < w)return Query1(node * 2, l, mid, ql, qr, w); return Query1(node * 2 + 1, mid + 1, r, ql, qr, w); } } if(ql > r || l > qr)return -1; int lc = Query1(node * 2, l, mid, ql, qr, w); if(lc == -1)return Query1(node * 2 + 1, mid + 1, r, ql, qr, w); return lc; } int Query2(int node, int l, int r, int ql, int qr, int w){ int mid = (l + r) / 2; if(ql <= l && r <= qr){ if(l == r){ if(sTree[node] < w)return l; else return -1; } else{ if(sTree[node * 2 + 1] < w)return Query2(node * 2 + 1, mid + 1, r, ql, qr, w); return Query2(node * 2, l, mid, ql, qr, w); } } if(ql > r || l > qr)return -1; int rc = Query2(node * 2 + 1, mid + 1, r, ql, qr, w); if(rc == -1)return Query2(node * 2, l, mid, ql, qr, w); return rc; } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; vector<int>e(n); for(int i = 1;i < n;++i){ int u, v, w; cin >> u >> v >> w; e[i] = w; } SegmentTree tree(n - 1); tree.Build(1, 1, n - 1, e); int q; cin >> q; while(q--){ int type; cin >> type; if(type == 1){ int b, r; cin >> b >> r; tree.Update(1, 1, n - 1, b, r); } else{ int s, w; cin >> s >> w; int R = tree.Query1(1, 1, n - 1, s, n - 1, w), L = tree.Query2(1, 1, n - 1, 1, s - 1, w); if(L == -1)L = 0; if(R == -1)R = n; int res = R - L; cout << res << '\n'; } } } /* 5 4 1 2 1 2 3 3 3 4 2 4 5 7 */
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...