#pragma GCC optimize("Ofast") #pragma GCC target("avx2") #define getrp() ({char*mmap();mmap(0l,1l<<25,1,2,0,0ll);}) #define rd() ({long _v=0,_c;while(_c=*rp++-48,_c>=0)_v=_v*10+_c;_v;}) #define wt(v) ({ulong _z=v;do*--wp=_z%10+48;while(_z/=10);}) #define wt1(v) ({char wbuf[64],*wp=wbuf+sizeof wbuf;wt(v);write(1,wp,wbuf+sizeof wbuf-wp);}) #define rep(v,e) for(long v=0;v>=1; a=1ll*a*a%MD; } return r; } int inverse(int a){ int b=MD; int u=1; int v=0; while(b){ int q=a/b,t; t=b, b=a-q*b, a=t; t=v, v=u-q*v, u=t; } if(u<0){ u+=MD; } return u; } typedef unsigned long ulong; void sort_aux(ulong*a,ulong*b,int n,int ph){ int c[512]; for(int i=0;i<512;++i){ c[i]=0; } for(int i=0;i>9|a[i]<<55; } } if(ph==1){ for(int i=0;i>23|a[i]<<41; } } } void sort(ulong*a,int n){ ulong*b=a+n; sort_aux(a,b,n,0); sort_aux(b,a,n,1); sort_aux(a,b,n,0); sort_aux(b,a,n,1); } typedef struct{ unsigned x,y; }XY; XY xy[200000*2]; int lis[200000]; long f1(long n){ long z=0; rep(i,n){ int x=xy[i].x; long l=-1,r=z; while(l+1>1; if(lis[m]<=x){ l=m; }else{ r=m; } } lis[r]=x; if(r==z){ ++z; } } return z; } int main(){ char*rp=getrp(); long h=rd()+rd()-3; long n=rd(); long p=rd(); rep(i,n){ xy[i].x=rd(); xy[i].y=rd(); } sort(xy,n); long z=f1(n); long x=1+MD-inverse(p); long y=(1+MD-1ll*modpow(x,h-z)*modpow((x*2-1)%MD,z)%MD)%MD; wt1(y); _exit(0); }