分析:
记录所有区间和给定的每一次的询问,二分询问的最小满足条件,可以通过前缀和来计算区间内有几个1。
代码:
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10;
int a[N];
pii e[N];
int x[N];
int n,m;
bool check(int mid)
{
for(int i=1;i<=n;i++) a[i]=0;
for(int i=1;i<=mid;i++) a[x[i]]=1;
for(int i=1;i<=n;i++) a[i]+=a[i-1];
for(int i=1;i<=m;i++)
{
int d=e[i].y-e[i].x+1;
if((a[e[i].y]-a[e[i].x-1])*2>d) return true;
}
return false;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int l,r;
cin>>l>>r;
e[i]={l,r};
}
int q;
cin>>q;
for(int i=1;i<=q;i++) cin>>x[i];
int l=1,r=q;
while(l<r)
{
int mid=(l+r)/2;
if(check(mid)) r=mid;
else l=mid+1;
}
if(check(l)) cout<<l<<'\n';
else cout<<-1<<'\n';
}
return 0;
}