Submission #1274033

#TimeUsernameProblemLanguageResultExecution timeMemory
1274033rana_azkaFountain (eJOI20_fountain)C++20
100 / 100
240 ms20692 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int INF = 1e18; const int MOD = 1e9+7; const int MAXN = 2e5; int n, m; int diameter[MAXN+5]; int kapasitas[MAXN+5]; int ans[MAXN+5]; vector<tuple<int, int, int>> query; // {tap, vol, idx} vector<pair<int, int>> query_idx[MAXN+5]; // {val, idx} vector<tuple<int, int, int>> monotonic; // {diameter, pref, idx} void solve(){ cin >> n >> m; for(int i = 1; i <= n; i++) cin >> diameter[i] >> kapasitas[i]; for(int i = 1; i <= m; i++){ int tap, vol; cin >> tap >> vol; query.push_back({tap, vol, i}); query_idx[tap].push_back({vol, i}); } sort(query.begin(), query.end()); monotonic.push_back({INF, 0, 0}); for(int i = n; i >= 1; i--){ auto [dmtr, pref, idx] = monotonic.back(); while(!monotonic.empty() && diameter[i] >= dmtr){ monotonic.pop_back(); dmtr = get<0>(monotonic.back()); pref = get<1>(monotonic.back()); idx = get<2>(monotonic.back()); } monotonic.push_back({diameter[i], pref + kapasitas[i], i}); auto [cur_dmtr, cur_pref, cur_idx] = monotonic.back(); for(auto [vol, idx] : query_idx[i]){ int res = 0; int left = 1, right = monotonic.size() - 1; int mid; while(left <= right){ mid = (left + right) / 2; auto [next_dmtr, next_pref, next_idx] = monotonic[mid-1]; auto [res_dmtr, res_pref, res_idx] = monotonic[mid]; int cek = cur_pref - next_pref; if(cek >= vol){ res = res_idx; left = mid + 1; }else{ right = mid - 1; } } ans[idx] = res; } } for(int i = 1; i <= m; i++) cout << ans[i] << endl; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tc = 1; // cin >> tc; while(tc--){ solve(); } return 0; } /* TEST CASE 6 5 4 10 6 8 3 5 4 14 10 9 4 20 1 25 6 30 5 8 3 13 2 8 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...