#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N=(1<<20);
int Tree[N*2+5][2];
int a[200005],b[200005],t[200005];
int n,q;
map <int,int> key,vl;
set <int> st;
vector <int> query[400001];
void update1(int i,int val){
    i+=N;
    Tree[i][0]=max(val,Tree[i][0]);
    i/=2;
    while(i!=0){
        Tree[i][0]=max(Tree[i*2][0],Tree[i*2+1][0]);
        i/=2;
    }
    return;
}
void update2(int i){
    i+=N;
    Tree[i][1]++;
    i/=2;
    while(i!=0){
        Tree[i][1]=Tree[i*2][1]+Tree[i*2+1][1];
        i/=2;
    }
    return;
}
int solve(int l1,int r1,int i,int u,int l,int r){
    if(l1>r||l>r1) return 0;
    if(l<=l1&&r1<=r) return Tree[i][u];
    int a=solve(l1,(l1+r1)/2,i*2,u,l,r);
    int b=solve((l1+r1)/2+1,r1,i*2+1,u,l,r);
    if(u==0) return max(a,b);
    else return a+b;
}
void compress(){
    int idx=1;
    for(int i:st){
        key[i]=idx;
        vl[idx]=i;
        idx++;
    }
    return;
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin>>n>>q;
    for(int i=1;i<=n;i++) {
        cin>>a[i]>>b[i];
        st.insert(a[i]);
        st.insert(b[i]);
    }
    for(int i=1;i<=q;i++){
        cin>>t[i];
        st.insert(t[i]);
    }
    compress();
    for(int i=1;i<=n;i++) a[i]=key[a[i]];
    for(int i=1;i<=n;i++) b[i]=key[b[i]];
    for(int i=1;i<=q;i++){
        t[i]=key[t[i]];
        update1(t[i],i);
    }
    // for(int i=1;i<=n;i++) cout<<a[i]<<" "<<b[i]<<endl;
    // for(int i=1;i<=q;i++) cout<<t[i]<<endl;
    //cout<<"input finish -----------"<<endl;
    for(int i=1;i<=n;i++){
        int idx=solve(0,N-1,1,0,min(a[i],b[i]),max(a[i],b[i])-1);
        //cout<<i<<" "<<idx<<endl;
        query[idx].push_back(i);
    }
    int sum=0;
    for(int i=q;i>=1;i--){
        update2(t[i]);
        for(int idx:query[i]){
            int val=solve(0,N-1,1,1,max(a[idx],b[idx]),n*2+q+1);
            if(val%2==0) sum+=max(vl[a[idx]],vl[b[idx]]);
            else sum+=min(vl[a[idx]],vl[b[idx]]);
        }
    }
    for(int idx:query[0]){
        int val=solve(0,N-1,1,1,max(a[idx],b[idx]),n*2+q+1);
        if(val%2==0) sum+=vl[a[idx]];
        else sum+=vl[b[idx]];    
        //cout<<idx<<" "<<sum<<" "<<max(a[idx],b[idx])<<endl;
    }
    cout<<sum<<endl;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |