제출 #983187

#제출 시각아이디문제언어결과실행 시간메모리
983187vjudge1Bridges (APIO19_bridges)C++17
29 / 100
601 ms13140 KiB
#include <time.h> #include <cstdlib> #include <stack> #include <numeric> #include <unordered_map> #include <unordered_set> #include <iomanip> #include <map> #include <set> #include <iterator> #include <deque> #include <queue> #include <sstream> #include <array> #include <string> #include <tuple> #include <chrono> #include <cassert> #include <cstdio> #include <cstring> #include <list> #include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <bitset> #define ll long long using namespace std; int tt = 1, n, m; ll a[200001], b[200001], c[200001]; vector<pair<int, ll>> g[200005]; ll mn[4 * 200005]; void up(int l, int r, int ind, int num, int v){ if(l > ind || r < ind) return; if(l == r){ mn[v] = num; return; } int mid = (l + r) / 2; up(l, mid, ind, num, v * 2); up(mid + 1, r, ind, num, v * 2 + 1); mn[v] = min(mn[v * 2], mn[v * 2 + 1]); } int get_mn(int l, int r, int l1, int r1, int v){ if(l > r1 || l1 > r) return 1e9; if(l >= l1 && r1 >= r) return mn[v]; int mid = (l + r) / 2; return min(get_mn(l, mid, l1, r1, v * 2), get_mn(mid + 1, r, l1, r1, v * 2 + 1)); } bool us[200005]; bool ok = 0; int main(){ ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n >> m; if(n - 1 != m) ok = 1; for(int i = 1; i <= m; i++){ cin >> a[i] >> b[i] >> c[i]; if(a[i] != i || b[i] != i + 1) ok = 1; up(1, m, i, c[i], 1); } cin >> tt; if(n <= 1000 && m <= 1000 && tt <= 10000){ for(int i = 1; i <= tt; i++){ int type; cin >> type; if(type == 1){ ll p, num; cin >> p >> num; c[p] = num; } else{ ll x, w; cin >> x >> w; queue<int> q; for(int i = 1; i <= n; i++){ g[i].clear(); us[i] = 0; } for(int i = 1; i <= m; i++){ g[a[i]].push_back({b[i], c[i]}); g[b[i]].push_back({a[i], c[i]}); } q.push(x); us[x] = 1; int kol = 1; while(!q.empty()){ int d = q.front(); q.pop(); for(auto to : g[d]){ if(!us[to.first] && to.second >= w){ kol++; us[to.first] = 1; q.push(to.first); } } } cout << kol << "\n"; } } return 0; } if(!ok){ for(int i = 1; i <= tt; i++){ int type; cin >> type; if(type == 1){ ll p, num; cin >> p >> num; up(1, m, p, num, 1); } else{ ll x, num; cin >> x >> num; int L = 0, R = x; while(L + 1 < R){ int mid = (L + R) / 2; if(get_mn(1, m, mid, x - 1, 1) >= num) R = mid; else L = mid; } int ans = (x - R); // cout << ans << "\n"; L = x - 1, R = n; while(L + 1 < R){ int mid = (L + R) / 2; if(get_mn(1, m, x, mid, 1) >= num) L = mid; else R = mid; } ans += (L - x + 1); // cout << i << " " << L << "\n"; cout << ans + 1 << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...