Warning: session_start(): open(/tmp/sess_6be0d9a1d83e38485e9e846e0d03e1ab, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239
Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239
Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430
Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/Action/Export.php on line 103
Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/Action/Export.php on line 103
Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/Action/Export.php on line 103
#include
#include
#include
#include
#include
using namespace std;
const int N=1e5+5,M=2e5+5;
int n,m;
int read()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
struct Node1{int a,b;}bomb[N];
struct Node2{int l,r,id;}cord[M];
struct Node3{int nxt,to,id;}Edges[M*2];
int num[N],cnt=0,w[N],head[N],tot=0;
bool vis[N],legal=true;
vectorc;
int getw(int x){return lower_bound(num+1,num+1+cnt,x)-num;}
void addedge(int u,int v,int id)
{
Edges[++tot].nxt=head[u];
head[u]=tot;
Edges[tot].id=id,Edges[tot].to=v;
}
void dfs(int u,int f,int fEdge)
{
vis[u]=1;
for(int i=head[u];~i;i=Edges[i].nxt)
{
int v=Edges[i].to;
if(!vis[v])dfs(v,u,Edges[i].id);
}
if(w[u]==1)
{
if(!f){legal=0;return;}
w[u]^=1,w[f]^=1,c.push_back(fEdge);
}
}
int main()
{
memset(head,-1,sizeof(head));
n=read(),m=read();
for(int i=1;i<=n;i++)
{
bomb[i].a=read(),bomb[i].b=read();
num[++cnt]=bomb[i].a;
}
sort(num+1,num+1+cnt);
cnt=unique(num+1,num+1+cnt)-num-1;
for(int i=1;i<=n;i++)w[getw(bomb[i].a)]=bomb[i].b;
for(int i=cnt+1;i;i--)w[i]^=w[i-1];
for(int i=1;i<=m;i++)
{
cord[i].l=read(),cord[i].r=read(),cord[i].id=i;
int x=getw(cord[i].l),y=getw(cord[i].r+1);
addedge(x,y,i),addedge(y,x,i);
}
for(int i=1;i<=cnt+1;i++)
{
if(!vis[i])dfs(i,0,0);
if(!legal)break;
}
if(!legal)puts("-1");
else
{
printf("%d\n",c.size());
sort(c.begin(),c.end());
for(int i=0;i