제출 #976039

#제출 시각아이디문제언어결과실행 시간메모리
976039vjudge1Fountain (eJOI20_fountain)C++17
100 / 100
353 ms39784 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define fi first #define se second #define pb push_back pair<int,int>a[100005]; vector<pair<int,int>>que[100005]; vector<int>adj[100005]; int ans[200005]; vector<int>nodes; vector<int>pref; int n, q; void dfs(int node){ //cout << "here >> " << node << endl; nodes.pb(node); if(node == n + 1)pref.pb(0); else pref.pb(pref.back() + a[node].se); for(auto it : que[node]){ int l = 1, r = pref.size() - 1, ret = -1; while(l <= r){ int mid = (l+r)/2; if(pref[pref.size()-1] - pref[mid-1] >= it.fi){ ret = mid; l = mid + 1; } else{ r = mid - 1; } } //cout << "here1 >> " << it.fi << " " << ret << endl; if(ret == -1)ans[it.se] = 0; else ans[it.se] = nodes[ret]; } for(auto it : adj[node])dfs(it); pref.pop_back(); nodes.pop_back(); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> q; for(int i = 1; i <= n; i++){ cin >> a[i].fi >> a[i].se; } for(int i = 1; i <= q; i++){ int x,y; cin >> x >> y; que[x].pb({y,i}); } vector<pair<int,int>>v; for(int i = 1; i <= n; i++){ v.push_back({a[i].fi,i}); } sort(v.begin(),v.end(),greater<pair<int,int>>()); set<int>s; s.insert(n+1); vector<int>tmp; for(int i = 0; i < n; i++){ int node = v[i].se; int idx = *s.upper_bound(node); adj[idx].pb(node); tmp.pb(node); if(i == n - 1 || v[i].fi != v[i+1].fi){ for(auto it : tmp)s.insert(it); tmp.clear(); } } dfs(n+1); for(int i = 1; i <= q; i++){ cout << ans[i] << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...