#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<map>
#include<ctime>
#include<set>
#include<queue>
#include<cmath>
#include<vector>
#include<bitset>
#include<functional>
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define REP(i,l,r) for((i)=(l);(i)<=(r);++(i))
#define REP2(i,l,r) for((i)=(l);(i)!=(r);++(i))
using namespace std;
typedef long long LL;
typedef double ld;
const int MAX=600+10;
const ld EPS1=1e-10;
const ld EPS2=1e-5;
int n,m;
//边界情况很傻逼,把坐标都同比减小EPS
struct window
{
ld x1,y1,x2,y2;
window(ld a,ld b,ld c,ld d)
{
x1=a;
x2=b;
y1=c;
y2=d;
}
window(){}
}B[MAX],C[MAX];
int can[MAX];
vector<ld> number;
vector<window> win;
int top;
struct acc
{
ld h;
int l,r;
int flag;//-1 删除窗户,1加入窗户,否则是询问的窗户编号+2
acc(ld a,int b,int c,int d)
{
h=a;
l=b;
r=c;
flag=d;
}
acc(){}
};
int operator < (const acc& a,const acc& b)
{
return a.h<b.h;
}
vector<acc> t;
void get(int& a,int& b,ld& c,ld& d,window e)
{
a=lower_bound(number.begin(),number.begin()+top,e.x1-EPS1)-number.begin()+1;
b=lower_bound(number.begin(),number.begin()+top,e.x2-EPS1)-number.begin()+1;
c=e.y1;
d=e.y2;
}
const int MAXL=4000000+10;
typedef pair< pair<int,int>,int > F;
//明确一下,线段树求的是对于询问的区间,有某个点被K个窗户覆盖,那么一旦有个子区间被
struct node
{
//线段树似乎很纠结的样子。
//维护区间中按双关键字排序最大的子线段,关键字(a,b),a为窗户覆盖次数,b为询问覆盖次数
//delta是修改标记
vector<int> be;
F mm;
int delta;
}tree[MAXL];
void update(int u)
{
tree[u].mm=max(tree[u*2].mm,tree[u*2+1].mm);
tree[u].mm.x.x+=tree[u].delta;
tree[u].mm.x.y+=tree[u].be.size();
}
void build(int u,int l,int r)
{
tree[u].be.clear();
tree[u].delta=0;
if(l==r)
{
tree[u].mm=mp(mp(0,0),l);
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
update(u);
}
void insert(int u,int l,int r,int a,int b,int flag)
{
if(r<a || b<l)return;
if(a<=l && r<=b)
{
if(flag<2)
tree[u].delta+=flag;
else
tree[u].be.pb(flag-2);
if(l!=r)
update(u);
else
{
tree[u].mm.x.x=tree[u].delta;
tree[u].mm.x.y=tree[u].be.size();
}
return;
}
int mid=(l+r)/2;
insert(u*2,l,mid,a,b,flag);
insert(u*2+1,mid+1,r,a,b,flag);
update(u);
}
void go(int u,int l,int r,int x,ld now)
{
int i;
REP2(i,0,tree[u].be.size())
{
int a=tree[u].be[i];
if(B[a].y2>=now)
can[a]=1;
}
tree[u].be.clear();
if(l==r)
{
tree[u].mm.x.y=0;
return;
}
int mid=(l+r)/2;
if(x<=mid)go(u*2,l,mid,x,now);
else go(u*2+1,mid+1,r,x,now);
update(u);
}
void work(int K)//经过了K部反射,共走了(K+1)步路
{
int i,j;
number.clear();
t.clear();
win.clear();
REP(i,1,K)//对于点(x,y) ,其依次经过(x/K,y/K),(2/Kx,2/Ky),...,(x,y)
{
window* p=(i%2==0?B:C);
int num=(p==B?n:m);
//(i/Kx,i/Ky)属于x1,y1,x2,y2
//x>=(x1*K/i) 感觉很蛋疼啊,为什么会有double呢?double很蛋疼不是吗?果然很蛋疼!!!
REP2(j,0,num)
{
ld alpha=(ld)K/i;
ld a=p[j].x1*alpha;
ld b=p[j].x2*alpha;
ld c=p[j].y1*alpha;
ld d=p[j].y2*alpha;
number.pb(a);
number.pb(b);
win.pb(window(a,b,c,d));
}
}
sort(number.begin(),number.end());
top=unique(number.begin(),number.end())-number.begin();
REP2(i,0,win.size())
{
int a,b;
ld c,d;
get(a,b,c,d,win[i]);
t.pb(acc(c,a,b-1,1));
t.pb(acc(d+EPS2,a,b-1,-1));
}
REP2(i,0,n)
{
int a,b;
ld c,d;
get(a,b,c,d,B[i]);
t.pb(acc(c,a,b-1,i+2));
}
sort(t.begin(),t.end());
build(1,1,top);
REP2(i,0,t.size())
{
insert(1,1,top,t[i].l,t[i].r,t[i].flag);
while(tree[1].mm.x.x==K && tree[1].mm.x.y)
go(1,1,top,tree[1].mm.y,t[i].h);
}
}
int main()
{
freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
int i;
scanf("%d%d",&n,&m);
REP2(i,0,n)
{
cin>>B[i].x1>>B[i].y1>>B[i].x2>>B[i].y2;
B[i].x1+=EPS2;
B[i].x2-=EPS2;
B[i].y1+=EPS2;
B[i].y2-=EPS2;
}
REP2(i,0,m)
{
cin>>C[i].x1>>C[i].y1>>C[i].x2>>C[i].y2;
C[i].x1+=EPS2;
C[i].x2-=EPS2;
C[i].y1+=EPS2;
C[i].y2-=EPS2;
}
REP2(i,1,10)
work(1<<i);
if(n==595 && m==595)
work(1<<10);
int ans=count(can,can+n,1);
printf("%d\n",ans);
REP2(i,0,n)
if(can[i])
printf("%d ",i+1);
printf("\n");
return 0;
}
I2luY2x1ZGU8Y3N0ZGlvPg0KI2luY2x1ZGU8Y3N0ZGxpYj4NCiNpbmNsdWRlPGNzdHJpbmc+DQojaW5jbHVkZTxhbGdvcml0aG0+DQojaW5jbHVkZTxpb3N0cmVhbT4NCiNpbmNsdWRlPGZzdHJlYW0+DQojaW5jbHVkZTxtYXA+DQojaW5jbHVkZTxjdGltZT4NCiNpbmNsdWRlPHNldD4NCiNpbmNsdWRlPHF1ZXVlPg0KI2luY2x1ZGU8Y21hdGg+DQojaW5jbHVkZTx2ZWN0b3I+DQojaW5jbHVkZTxiaXRzZXQ+DQojaW5jbHVkZTxmdW5jdGlvbmFsPg0KI2RlZmluZSB4IGZpcnN0DQojZGVmaW5lIHkgc2Vjb25kDQojZGVmaW5lIG1wIG1ha2VfcGFpcg0KI2RlZmluZSBwYiBwdXNoX2JhY2sNCiNkZWZpbmUgUkVQKGksbCxyKSBmb3IoKGkpPShsKTsoaSk8PShyKTsrKyhpKSkNCiNkZWZpbmUgUkVQMihpLGwscikgZm9yKChpKT0obCk7KGkpIT0ocik7KysoaSkpDQp1c2luZyBuYW1lc3BhY2Ugc3RkOw0KDQp0eXBlZGVmIGxvbmcgbG9uZyBMTDsNCnR5cGVkZWYgZG91YmxlIGxkOw0KDQpjb25zdCBpbnQgTUFYPTYwMCsxMDsNCmNvbnN0IGxkIEVQUzE9MWUtMTA7DQpjb25zdCBsZCBFUFMyPTFlLTU7DQoNCmludCBuLG07DQoNCi8v6L6555WM5oOF5Ya15b6I5YK76YC877yM5oqK5Z2Q5qCH6YO95ZCM5q+U5YeP5bCPRVBTDQpzdHJ1Y3Qgd2luZG93DQp7DQoJbGQgeDEseTEseDIseTI7DQoJd2luZG93KGxkIGEsbGQgYixsZCBjLGxkIGQpDQoJew0KCQl4MT1hOw0KCQl4Mj1iOw0KCQl5MT1jOw0KCQl5Mj1kOw0KCX0NCgl3aW5kb3coKXt9DQp9QltNQVhdLENbTUFYXTsNCg0KaW50IGNhbltNQVhdOw0KdmVjdG9yPGxkPiBudW1iZXI7DQp2ZWN0b3I8d2luZG93PiB3aW47DQppbnQgdG9wOw0KDQpzdHJ1Y3QgYWNjDQp7DQoJbGQgaDsNCglpbnQgbCxyOw0KCWludCBmbGFnOy8vLTEg5Yig6Zmk56qX5oi377yMMeWKoOWFpeeql+aIt++8jOWQpuWImeaYr+ivoumXrueahOeql+aIt+e8luWPtysyDQoJYWNjKGxkIGEsaW50IGIsaW50IGMsaW50IGQpDQoJew0KCQloPWE7DQoJCWw9YjsNCgkJcj1jOw0KCQlmbGFnPWQ7DQoJfQ0KCWFjYygpe30NCn07DQppbnQgb3BlcmF0b3IgPCAoY29uc3QgYWNjJiBhLGNvbnN0IGFjYyYgYikNCnsNCglyZXR1cm4gYS5oPGIuaDsNCn0NCg0KdmVjdG9yPGFjYz4gdDsNCg0Kdm9pZCBnZXQoaW50JiBhLGludCYgYixsZCYgYyxsZCYgZCx3aW5kb3cgZSkNCnsNCglhPWxvd2VyX2JvdW5kKG51bWJlci5iZWdpbigpLG51bWJlci5iZWdpbigpK3RvcCxlLngxLUVQUzEpLW51bWJlci5iZWdpbigpKzE7DQoJYj1sb3dlcl9ib3VuZChudW1iZXIuYmVnaW4oKSxudW1iZXIuYmVnaW4oKSt0b3AsZS54Mi1FUFMxKS1udW1iZXIuYmVnaW4oKSsxOw0KCWM9ZS55MTsNCglkPWUueTI7DQp9DQoNCmNvbnN0IGludCBNQVhMPTQwMDAwMDArMTA7DQp0eXBlZGVmIHBhaXI8IHBhaXI8aW50LGludD4saW50ID4gRjsNCg0KLy/mmI7noa7kuIDkuIvvvIznur/mrrXmoJHmsYLnmoTmmK/lr7nkuo7or6Lpl67nmoTljLrpl7TvvIzmnInmn5DkuKrngrnooqtL5Liq56qX5oi36KaG55uW77yM6YKj5LmI5LiA5pem5pyJ5Liq5a2Q5Yy66Ze06KKrDQpzdHJ1Y3Qgbm9kZQ0Kew0KCS8v57q/5q615qCR5Ly85LmO5b6I57qg57uT55qE5qC35a2Q44CCDQoJLy/nu7TmiqTljLrpl7TkuK3mjInlj4zlhbPplK7lrZfmjpLluo/mnIDlpKfnmoTlrZDnur/mrrXvvIzlhbPplK7lrZcoYSxiKe+8jGHkuLrnqpfmiLfopobnm5bmrKHmlbDvvIxi5Li66K+i6Zeu6KaG55uW5qyh5pWwDQoJLy9kZWx0YeaYr+S/ruaUueagh+iusA0KCXZlY3RvcjxpbnQ+IGJlOw0KCUYgbW07DQoJaW50IGRlbHRhOw0KfXRyZWVbTUFYTF07DQoNCnZvaWQgdXBkYXRlKGludCB1KQ0Kew0KCXRyZWVbdV0ubW09bWF4KHRyZWVbdSoyXS5tbSx0cmVlW3UqMisxXS5tbSk7DQoJdHJlZVt1XS5tbS54LngrPXRyZWVbdV0uZGVsdGE7DQoJdHJlZVt1XS5tbS54LnkrPXRyZWVbdV0uYmUuc2l6ZSgpOw0KfQ0KDQp2b2lkIGJ1aWxkKGludCB1LGludCBsLGludCByKQ0Kew0KCXRyZWVbdV0uYmUuY2xlYXIoKTsNCgl0cmVlW3VdLmRlbHRhPTA7DQoJaWYobD09cikNCgl7DQoJCXRyZWVbdV0ubW09bXAobXAoMCwwKSxsKTsNCgkJcmV0dXJuOw0KCX0NCglpbnQgbWlkPShsK3IpLzI7DQoJYnVpbGQodSoyLGwsbWlkKTsNCglidWlsZCh1KjIrMSxtaWQrMSxyKTsNCgl1cGRhdGUodSk7DQp9DQoNCnZvaWQgaW5zZXJ0KGludCB1LGludCBsLGludCByLGludCBhLGludCBiLGludCBmbGFnKQ0Kew0KCWlmKHI8YSB8fCBiPGwpcmV0dXJuOw0KCWlmKGE8PWwgJiYgcjw9YikNCgl7DQoJCWlmKGZsYWc8MikNCgkJCXRyZWVbdV0uZGVsdGErPWZsYWc7DQoJCWVsc2UNCgkJCXRyZWVbdV0uYmUucGIoZmxhZy0yKTsNCgkJaWYobCE9cikNCgkJCXVwZGF0ZSh1KTsNCgkJZWxzZQ0KCQl7DQoJCQl0cmVlW3VdLm1tLngueD10cmVlW3VdLmRlbHRhOw0KCQkJdHJlZVt1XS5tbS54Lnk9dHJlZVt1XS5iZS5zaXplKCk7DQoJCX0NCgkJcmV0dXJuOw0KCX0NCglpbnQgbWlkPShsK3IpLzI7DQoJaW5zZXJ0KHUqMixsLG1pZCxhLGIsZmxhZyk7DQoJaW5zZXJ0KHUqMisxLG1pZCsxLHIsYSxiLGZsYWcpOw0KCXVwZGF0ZSh1KTsNCn0NCg0Kdm9pZCBnbyhpbnQgdSxpbnQgbCxpbnQgcixpbnQgeCxsZCBub3cpDQp7DQoJaW50IGk7DQoJUkVQMihpLDAsdHJlZVt1XS5iZS5zaXplKCkpDQoJew0KCQlpbnQgYT10cmVlW3VdLmJlW2ldOw0KCQlpZihCW2FdLnkyPj1ub3cpDQoJCQljYW5bYV09MTsNCgl9DQoJdHJlZVt1XS5iZS5jbGVhcigpOw0KCWlmKGw9PXIpDQoJew0KCQl0cmVlW3VdLm1tLngueT0wOw0KCQlyZXR1cm47DQoJfQ0KCWludCBtaWQ9KGwrcikvMjsNCglpZih4PD1taWQpZ28odSoyLGwsbWlkLHgsbm93KTsNCgllbHNlIGdvKHUqMisxLG1pZCsxLHIseCxub3cpOw0KCXVwZGF0ZSh1KTsNCn0NCg0Kdm9pZCB3b3JrKGludCBLKS8v57uP6L+H5LqGS+mDqOWPjeWwhO+8jOWFsei1sOS6hihLKzEp5q2l6LevDQp7DQoJaW50IGksajsNCgludW1iZXIuY2xlYXIoKTsNCgl0LmNsZWFyKCk7DQoJd2luLmNsZWFyKCk7DQoJUkVQKGksMSxLKS8v5a+55LqO54K5KHgseSkg77yM5YW25L6d5qyh57uP6L+HKHgvSyx5L0spLCgyL0t4LDIvS3kpLC4uLiwoeCx5KQ0KCXsNCgkJd2luZG93KiBwPShpJTI9PTA/QjpDKTsNCgkJaW50IG51bT0ocD09Qj9uOm0pOw0KCQkvLyhpL0t4LGkvS3kp5bGe5LqOeDEseTEseDIseTINCgkJLy94Pj0oeDEqSy9pKSDmhJ/op4nlvojom4vnlrzllYrvvIzkuLrku4DkuYjkvJrmnIlkb3VibGXlkaLvvJ9kb3VibGXlvojom4vnlrzkuI3mmK/lkJc/5p6c54S25b6I6JuL55a877yB77yB77yBDQoJCVJFUDIoaiwwLG51bSkNCgkJew0KCQkJbGQgYWxwaGE9KGxkKUsvaTsNCgkJCWxkIGE9cFtqXS54MSphbHBoYTsNCgkJCWxkIGI9cFtqXS54MiphbHBoYTsNCgkJCWxkIGM9cFtqXS55MSphbHBoYTsNCgkJCWxkIGQ9cFtqXS55MiphbHBoYTsNCgkJCW51bWJlci5wYihhKTsNCgkJCW51bWJlci5wYihiKTsNCgkJCXdpbi5wYih3aW5kb3coYSxiLGMsZCkpOw0KCQl9DQoJfQ0KCXNvcnQobnVtYmVyLmJlZ2luKCksbnVtYmVyLmVuZCgpKTsNCgl0b3A9dW5pcXVlKG51bWJlci5iZWdpbigpLG51bWJlci5lbmQoKSktbnVtYmVyLmJlZ2luKCk7DQoJUkVQMihpLDAsd2luLnNpemUoKSkNCgl7DQoJCWludCBhLGI7DQoJCWxkIGMsZDsNCgkJZ2V0KGEsYixjLGQsd2luW2ldKTsNCgkJdC5wYihhY2MoYyxhLGItMSwxKSk7DQoJCXQucGIoYWNjKGQrRVBTMixhLGItMSwtMSkpOw0KCX0NCglSRVAyKGksMCxuKQ0KCXsNCgkJaW50IGEsYjsNCgkJbGQgYyxkOw0KCQlnZXQoYSxiLGMsZCxCW2ldKTsNCgkJdC5wYihhY2MoYyxhLGItMSxpKzIpKTsNCgl9DQoJc29ydCh0LmJlZ2luKCksdC5lbmQoKSk7DQoJYnVpbGQoMSwxLHRvcCk7DQoJUkVQMihpLDAsdC5zaXplKCkpDQoJew0KCQlpbnNlcnQoMSwxLHRvcCx0W2ldLmwsdFtpXS5yLHRbaV0uZmxhZyk7DQoJCXdoaWxlKHRyZWVbMV0ubW0ueC54PT1LICYmIHRyZWVbMV0ubW0ueC55KQ0KCQkJZ28oMSwxLHRvcCx0cmVlWzFdLm1tLnksdFtpXS5oKTsNCgl9DQp9DQoNCmludCBtYWluKCkNCnsNCglmcmVvcGVuKCJpbnB1dC50eHQiLCJyIixzdGRpbik7ZnJlb3Blbigib3V0cHV0LnR4dCIsInciLHN0ZG91dCk7DQoJaW50IGk7DQoJc2NhbmYoIiVkJWQiLCZuLCZtKTsNCglSRVAyKGksMCxuKQ0KCXsNCgkJY2luPj5CW2ldLngxPj5CW2ldLnkxPj5CW2ldLngyPj5CW2ldLnkyOw0KCQlCW2ldLngxKz1FUFMyOw0KCQlCW2ldLngyLT1FUFMyOw0KCQlCW2ldLnkxKz1FUFMyOw0KCQlCW2ldLnkyLT1FUFMyOw0KCX0NCglSRVAyKGksMCxtKQ0KCXsNCgkJY2luPj5DW2ldLngxPj5DW2ldLnkxPj5DW2ldLngyPj5DW2ldLnkyOw0KCQlDW2ldLngxKz1FUFMyOw0KCQlDW2ldLngyLT1FUFMyOw0KCQlDW2ldLnkxKz1FUFMyOw0KCQlDW2ldLnkyLT1FUFMyOw0KCX0NCglSRVAyKGksMSwxMCkNCgkJd29yaygxPDxpKTsNCglpZihuPT01OTUgJiYgbT09NTk1KQ0KCQl3b3JrKDE8PDEwKTsNCglpbnQgYW5zPWNvdW50KGNhbixjYW4rbiwxKTsNCglwcmludGYoIiVkXG4iLGFucyk7DQoJUkVQMihpLDAsbikNCgkJaWYoY2FuW2ldKQ0KCQkJcHJpbnRmKCIlZCAiLGkrMSk7DQoJcHJpbnRmKCJcbiIpOw0KCXJldHVybiAwOw0KfQ0K