#include<bits/stdc++.h>
using namespace std;
struct query { int l,r,pos; };
const int MAXN=2e5+5;
const int sqr=500;
int cnt[MAXN],block[MAXN],block2[MAXN],A[MAXN],B[MAXN],val[MAXN],pos[MAXN],V[MAXN];
query Q[MAXN];
bool comp(query a,query b)
{
	if(a.l/sqr==b.l/sqr) return a.r<b.r;
	return a.l/sqr<b.l/sqr;
}
bool cnum(int a,int b) { return val[a]<val[b]; }
void update(int i,int val)
{
	block[i/sqr]-=(cnt[i]==1);
	block2[i/sqr]-=(cnt[i]==0);
	cnt[i]+=val;
	block[i/sqr]+=(cnt[i]==1);
	block2[i/sqr]+=(cnt[i]==0);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>A[i]>>B[i];
	for(int i=1;i<=q;i++) 
	{
		cin>>val[i];
		V[i]=val[i],pos[i]=i;
	}
	sort(pos+1,pos+q+1,cnum);
	sort(V+1,V+q+1);
	for(int i=1;i<=n;i++)
	{
		int l=lower_bound(V+1,V+q+1,min(A[i],B[i]))-V-1;
		int r=lower_bound(V+1,V+q+1,max(A[i],B[i]))-V-1;
		Q[i]={l,r,i};
	}
	sort(Q+1,Q+n+1,comp);
	int l=0,r=0,cb=q/sqr;
	long long ans=0;
	for(int i=1;i<=n;i++) block2[i/sqr]++;
	for(int i=1;i<=n;i++)
	{
		while(l<Q[i].l) update(pos[++l],1);
		while(r<Q[i].r) update(pos[++r],1);
		while(l>Q[i].l) update(pos[l--],-1);
		while(r>Q[i].r) update(pos[r--],-1);
		int p=1,f=0;
		for(int j=cb;j+1;j--) if(block[j])
		{
			for(int k=(j+1)*sqr-1;;k--) if(cnt[k]==1)
			{
				p=k+1;
				break;
			}
			break;
		}
		if(p!=1&&A[Q[i].pos]<B[Q[i].pos]) f=1;
		while(p<=q&&p%sqr) f^=(cnt[p++]==0);
		if(p<=q)
		{
			p/=sqr;
			while(p<=cb) f^=(block2[p++]&1);
		}
		if(f) ans+=B[Q[i].pos];
		else ans+=A[Q[i].pos];
	}
	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... |