#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, b, a) for (int i = (b), _a = (a); i >= _a; i--)
#define pa pair<ll, ll>
#define fi first
#define se second
#define bit(mask, j) ((mask >> j) & 1)
const ll mod = 1e9 + 7;
const ll INF = 1e18;
//--------------------------------------------------------------------
const ll N = 2e5 + 10;
ll a[N], b[N];
struct segtree {
ll mn;
bool sum;
} st[4 * N];
ll n, k;
void update(ll u, ll val, ll id = 1, ll l = 1, ll r = k) {
if(u > r || u < l) return;
if(l == r) {
st[id].sum = 1;
st[id].mn = val;
return;
}
ll mid = l + r >> 1;
update(u, val, id << 1, l, mid);
update(u, val, id << 1 | 1, mid + 1, r);
st[id].sum = st[id << 1].sum ^ st[id << 1 | 1].sum;
st[id].mn = min(st[id << 1].mn, st[id << 1 | 1].mn);
}
ll walk(ll w, ll id = 1, ll l = 1, ll r = k) {
if(st[id].mn > w) return 0;
if(l == r) return l;
ll mid = l + r >> 1;
ll res = 0;
res = walk(w, id << 1 | 1, mid + 1, r);
if(res != 0) return res;
return walk(w, id << 1, l, mid);
}
bool get(ll u, ll v, ll id = 1, ll l = 1, ll r = k) {
if(u > r || v < l) return 0;
if(u <= l && v >= r) return st[id].sum;
ll mid = l + r>> 1;
return (get(u, v, id << 1, l, mid) ^ get(u, v, id << 1 | 1, mid + 1, r));
}
void hbmt() {
cin >> n >> k;
vector<pa> vt;
ll ans = 0;
FOR(i, 1, n) {
cin >> a[i] >> b[i];
if(a[i] == b[i]) {
ans += a[i];
}
else {
vt.push_back({min(a[i], b[i]), i});
}
}
FOR(i, 1, 4 * k) {
st[i].mn = INF;
}
FOR(i, 1, k) {
ll t;
cin >> t;
vt.push_back({t, -i});
}
sort(vt.begin(), vt.end(), [&] (pa &x, pa &y) {
return x.fi > y.fi || x.fi == y.fi && x.se < y.se;
});
for(auto e : vt) {
if(e.se < 0) {
update(-e.se, e.fi); // lay min va (tong 0 1)
}
else {
ll id = e.se, mn = e.fi;
ll mx = max(a[id], b[id]);
ll pos = walk(mx - 1);
bool c = get(pos + 1, n);
if(pos != 0) {
a[id] = mx, b[id] = mn;
}
if(c == 1) swap(a[id], b[id]);
ans += a[id];
}
}
cout << ans;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
#define NAME "hbmt"
if(fopen(NAME".inp", "r")) {
freopen(NAME".inp", "r", stdin);
freopen(NAME".out", "w", stdout);
}
//int t;cin>>t;while(t--)
hbmt();
return 0;
}
Compilation message (stderr)
fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:99:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
99 | freopen(NAME".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:100:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
100 | freopen(NAME".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |