제출 #1130720

#제출 시각아이디문제언어결과실행 시간메모리
1130720Ludissey다리 (APIO19_bridges)C++20
16 / 100
604 ms8876 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; 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{nullptr,nullptr,0}; x->right = new node{nullptr,nullptr,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 1e12; 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); } }; signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n,m,q; cin >> n >> m; neigh.resize(n); w.resize(m); for (int i = 0; i < m; i++) { int u,v; cin >> u >> v >> w[i]; } cin >> q; if(n==1){ for (int i = 0; i < q; i++) { int t; cin >> t; int a,b; cin >> a >> b; if(t==2) cout << 1 << "\n"; continue; } return 0; } segtree seg(m); for (int i = 0; i < q; i++) { int t; cin >> t; if(n==1){ if(t==2) cout << 1 << "\n"; continue; } 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) { ans2=mid+1; l=mid+1; }else{ r=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...