제출 #1130707

#제출 시각아이디문제언어결과실행 시간메모리
1130707LudisseyBridges (APIO19_bridges)C++20
0 / 100
323 ms8156 KiB
#include <bits/stdc++.h> #define int long long #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() using namespace std; vector<vector<pair<int,int>>> neigh; vector<int> w; vector<int> visited; //SUM struct node { node* left; node* right; int mn; void update(){ mn=min(left->mn, right->mn); } }; struct segtree { int n; node* root=new node{nullptr,nullptr,0}; void build(node* x, int l, int r){ if(l==r){ x->mn=w[l]; return; } x->left = new node{NULL,NULL,0}; x->right = new node{NULL,NULL,0}; int mid=(l+r)/2; build(x->left,l,mid); build(x->right,mid+1,r); x->update(); } segtree(int n2){ n=n2; build(root,0,n-1); } void update(node* x, int l, int r, int qP, int qV){ if(r<qP||l>qP) return; if(l==r){ x->mn=qV; return; } int mid=(l+r)/2; update(x->left,l,mid,qP,qV); update(x->right,mid+1,r,qP,qV); x->update(); } void update(int qP, int qV){ update(root,0,n-1,qP,qV); } int query(node* x, int l, int r, int qL, int qR){ if(r<qL||l>qR) return 1e17; if(qL<=l&&r<=qR){ return x->mn; } int mid=(l+r)/2; return min(query(x->left,l,mid,qL,qR),query(x->right,mid+1,r,qL,qR)); } int query(int qL, int qR){ return query(root,0,n-1,qL,qR); } }; int dfs(int x, int p, int mn){ int s=1; if(visited[x]) return 0; visited[x]=true; for (auto u : neigh[x]) { if(u.first==p) continue; if(w[u.second]>=mn) s+=dfs(u.first,x,mn); } return s; } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n,m,q; cin >> n >> m; neigh.resize(n); w.resize(n-1); visited.resize(n); for (int i = 0; i < m; i++) { int u,v; cin >> u >> v >> w[i]; neigh[u-1].push_back({v-1,i}); neigh[v-1].push_back({u-1,i}); } segtree seg(m); cin >> q; for (int i = 0; i < q; i++) { int t; cin >> t; if(t==1){ int b,r; cin >> b >> r; seg.update(b-1,r); }else{ int s,mw; cin >> s >> mw; s--; int l=0; int r=s-1; int ans=s; while(l<=r){ int mid=(l+r)/2; int qu=seg.query(mid,s-1); if(qu>=mw) { ans=mid; r=mid-1; }else{ l=mid+1; } } l=s; r=m-1; int ans2=s; while(l<=r){ int mid=(l+r)/2; int qu=seg.query(s,mid); if(qu<mw) { r=mid-1; }else{ ans2=mid+1; l=mid+1; } } cout << (ans2-ans)+1 << "\n"; } } return 0; }
#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...