Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #define debug(l) cerr<<#l<<' '<<l<<'\n';
- #include "bits/stdc++.h"
- using namespace std;
- #define all(a) a.begin(), a.end()
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef long double ld;
- struct Segtree {
- vector<pll> t;
- Segtree(ll n) {
- t.resize(4 * n);
- }
- void build(vector<pair<ll, pll>>& a, ll v, ll tl, ll tr) {
- if (tl == tr) {
- t[v] = a[tl].second;
- return;
- }
- ll tm = (tl + tr) / 2;
- build(a, v * 2, tl, tm);
- build(a, v * 2 + 1, tm + 1, tr);
- t[v] = max(t[v * 2], t[v * 2 + 1]);
- }
- pll get_mx(ll v, ll tl, ll tr, ll l, ll r) {
- if (tl > r || tr < l) {
- return { -1e18,0 };
- }
- if (tl >= l && tr <= r) {
- return t[v];
- }
- ll tm = (tl + tr) / 2;
- return max(get_mx(v * 2, tl, tm, l, r), get_mx(v * 2 + 1, tm + 1, tr, l, r));
- }
- };
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- freopen("dowry.in", "r", stdin);
- freopen("dowry.out", "w", stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- ll n;
- cin >> n;
- ll l, r;
- cin >> l >> r;
- vector<pll> a(n);
- for (ll i = 0; i < n; i++) {
- cin >> a[i].first >> a[i].second;
- }
- ll mid = n / 2;
- vector<pair<ll, pll>> q;
- vector<ll> w;
- for (ll mask = 0; mask < (1 << mid); mask++) {
- ll s = 0;
- ll c = 0;
- for (ll i = 0; i < mid; i++) {
- if ((mask >> i) & 1) {
- s += a[i].first;
- c += a[i].second;
- }
- }
- q.push_back({ s,{ c, mask } });
- w.push_back(s);
- }
- sort(all(w));
- sort(all(q));
- Segtree T((ll)w.size());
- T.build(q, 1, 0, (ll)w.size() - 1);
- const ll mod = 1e3;
- pair<ll, pll> masks = { -mod, {0,0} };
- ll cr = n - mid;
- for (ll mask = 0; mask < (1 << cr); mask++) {
- ll s = 0, c = 0;
- for (ll i = 0; i < cr; i++) {
- if ((mask >> i) & 1) {
- s += a[mid + i].first;
- c += a[mid + i].second;
- }
- }
- ll j = upper_bound(all(w), r - s) - w.begin();
- ll i = lower_bound(all(w), l - s) - w.begin();
- if (i > w.size() - 1)continue;
- if (j == (ll)w.size())j--;
- else if (w[j] > r - s) {
- j--;
- }
- if (i == (ll)w.size())continue;
- //if (j == 0) continue;
- pll mx = T.get_mx(1, 0, (ll)w.size() - 1, i, j);
- if (mx.first + c > masks.first) {
- masks = { mx.first + c,{mx.second,mask} };
- }
- }
- vector<ll> ans;
- for (ll i = 0; i < mid; i++) {
- if ((masks.second.first >> i) & 1) {
- ans.push_back(i + 1);
- }
- }
- for (ll i = 0; i < cr; i++) {
- if ((masks.second.second >> i) & 1) {
- ans.push_back(mid + i + 1);
- }
- }
- cout << ans.size() << '\n';
- for (ll& i : ans) {
- cout << i << ' ';
- }
- }
Add Comment
Please, Sign In to add comment