#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl '\n'
const int N=2e5+5,MOD=1e9+7,inf=1e18;
int seg[N*20][2],offset=(1<<20);
void update(int idx,int val,int type){
    idx+=offset;
    if(!type)seg[idx][type]=max(seg[idx][type],val);
    else seg[idx][type]+=val;
    idx/=2;
    while(idx>0){
        if(type)seg[idx][type]=seg[idx*2][type]+seg[idx*2+1][type];
        else seg[idx][type]=max(seg[idx*2][type],seg[idx*2+1][type]);
        idx/=2;
    }
}
int query(int node,int qlo,int qhi,int lo,int hi,int type){
    if(lo>=qlo && hi<=qhi)return seg[node][type];
    if(lo>qhi || hi<qlo){
        if(type)return 0;
        return -inf;
    }
    int mid=(lo+hi)/2;
    int x=query(node*2,qlo,qhi,lo,mid,type);
    int y=query(node*2+1,qlo,qhi,mid+1,hi,type);
    if(type)return x+y;
    return max(x,y);
}
signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    for(int i=0;i<N*20;i++)seg[i][0]=-inf;
    int n,k; cin>>n>>k;
    int a[n],b[n],t[k];
    set<int> s;
    for(int i=0;i<n;i++){
        cin>>a[i]>>b[i];
        s.insert(a[i]); s.insert(b[i]);
    }
    for(int i=0;i<k;i++){
        cin>>t[i];
        s.insert( t[i]);
    }
    unordered_map<int,int> mp,og;
    int cnt=0;
    for(auto i:s){
        og[cnt]=i;
        mp[i]=cnt++;
    }
    vector<pair<int,int>> v;
    for(int i=0;i<n;i++){
        a[i]=mp[a[i]];
        b[i]=mp[b[i]];
        v.pb({max(a[i],b[i]),i});
    }
    vector<pair<int,int>> vec;
    for(int i=0;i<k;i++){
        t[i]=mp[t[i]];
        vec.pb({t[i],i});
        update(i,1,1);
    }
    sort(vec.begin(),vec.end());
    sort(v.begin(),v.end());
    int l=0,ans=0;
    for(auto i:vec){
        while(l<v.size() && (i==vec.back() || v[l].first<=i.first)){
            if(i==vec.back() && v[l].first>i.first){
                update(i.first,i.second,0);
                update(i.second,-1,1);
            }
            int ca=a[v[l].second],cb=b[v[l].second];
            if(ca==cb){
                ans+=og[ca];
                l++;
                continue;
            }
            int idx=query(1,min(cb,ca),max(ca,cb)-1,0,offset-1,0);
            if(idx==-inf){
                if(query(1,0,offset-1,0,offset-1,1)%2)ans+=og[cb];
                else ans+=og[ca];
                l++;
                continue;
            }
            int y=query(1,idx+1,offset-1,0,offset-1,1);
            if(y%2)ans+=min(og[cb],og[ca]);
            else ans+=max(og[ca],og[cb]);
            l++;
        }
        update(i.first,i.second,0);
        update(i.second,-1,1);
    }
    cout<<ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |