分析:
记录所有区间和给定的每一次的询问,二分询问的最小满足条件,可以通过前缀和来计算区间内有几个1。
代码:
#include <bits/stdc++.h>#define x first
#define y secondusing 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;
}