#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const long long mod=1000000007;
int n,m;
int v[100010],a[100010];
int st[1000010],sd;
int rt[400010];
struct nod
{
int l,r,v,v2;
};
vector<nod>s;
void add2(int o,int l,int r,int i,int x,int ad)
{
if(l==r)
{
s[o].v+=x;
s[o].v2+=ad;
return;
}
if(i<=(l+r>>1))
{
if(s[o].l==-1)
{
if(sd)
{
s[o].l=st[sd];
sd--;
}
else
{
s[o].l=s.size();
s.push_back((nod){-1,-1,0,0});
}
}
add2(s[o].l,l,(l+r>>1),i,x,ad);
if(!s[s[o].l].v2&&sd<=1000000)
{
st[++sd]=s[o].l;
s[s[o].l]={-1,-1,0,0};
s[o].l=-1;
}
}
else
{
if(s[o].r==-1)
{
if(sd)
{
s[o].r=st[sd];
sd--;
}
else
{
s[o].r=s.size();
s.push_back((nod){-1,-1,0,0});
}
}
add2(s[o].r,(l+r>>1)+1,r,i,x,ad);
if(!s[s[o].r].v2&&sd<=1000000)
{
st[++sd]=s[o].r;
s[s[o].r]={-1,-1,0,0};
s[o].r=-1;
}
}
s[o].v=0;
s[o].v2=0;
if(s[o].l!=-1)
{
s[o].v+=s[s[o].l].v;
s[o].v2+=s[s[o].l].v2;
}
if(s[o].r!=-1)
{
s[o].v+=s[s[o].r].v;
s[o].v2+=s[s[o].r].v2;
}
s[o].v%=mod;
}
void build(int o,int l,int r)
{
if(l<r)
{
build(o<<1,l,(l+r>>1));
build(o<<1|1,(l+r>>1)+1,r);
}
rt[o]=s.size();
s.push_back((nod){-1,-1,0,0});
for(int i=l;i<=r;i++)
{
add2(rt[o],1,50000,v[i],a[i],1);
}
}
void dlt(int o,int l,int r,int x,int ad)
{
add2(rt[o],1,50000,v[x],ad*a[x],ad);
if(l==r)
{
return;
}
if(x<=(l+r>>1))
{
dlt(o<<1,l,(l+r>>1),x,ad);
}
else
{
dlt(o<<1|1,(l+r>>1)+1,r,x,ad);
}
}
long long r1,r2;
void query2(int o,int l,int r,int il,int ir)
{
if(il<=l&&ir>=r)
{
r1+=s[o].v;
r2+=s[o].v2;
r1%=mod;
return;
}
if(il<=(l+r>>1)&&s[o].l!=-1)
{
query2(s[o].l,l,(l+r>>1),il,ir);
}
if(ir>(l+r>>1)&&s[o].r!=-1)
{
query2(s[o].r,(l+r>>1)+1,r,il,ir);
}
}
void query(int o,int l,int r,int il,int ir,int jl,int jr)
{
if(il<=l&&ir>=r)
{
query2(rt[o],1,50000,jl,jr);
return;
}
if(il<=(l+r>>1))
{
query(o<<1,l,(l+r>>1),il,ir,jl,jr);
}
if(ir>(l+r>>1))
{
query(o<<1|1,(l+r>>1)+1,r,il,ir,jl,jr);
}
}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
signed main()
{
n=read();
m=read();
for(int i=1;i<=n;i++)
{
v[i]=read();
a[i]=read();
}
build(1,1,n);
long long cnt=0;
for(int i=1;i<=n;i++)
{
r1=r2=0;
query(1,1,n,1,i,v[i],50000);
cnt+=(r1+(r2-2)*a[i])%mod;
cnt%=mod;
}
while(m--)
{
int x,y;
x=read();
y=read();
r1=r2=0;
query(1,1,n,1,x,v[x],50000);//cout<<r1<<' '<<r2<<endl;
cnt-=(r1+a[x]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
r1=r2=0;
query(1,1,n,x,n,1,v[x]);//cout<<r1<<' '<<r2<<endl;
cnt-=(r1+a[x]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
dlt(1,1,n,x,-1);
r1=r2=0;
query(1,1,n,1,y,v[y],50000);//cout<<r1<<' '<<r2<<endl;
cnt-=(r1+a[y]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
r1=r2=0;
query(1,1,n,y,n,1,v[y]);//cout<<r1<<' '<<r2<<endl;
cnt-=(r1+a[y]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
dlt(1,1,n,y,-1);
swap(v[x],v[y]);
swap(a[x],a[y]);
dlt(1,1,n,x,1);
r1=r2=0;
query(1,1,n,1,x,v[x],50000);//cout<<r1<<' '<<r2<<endl;
cnt+=(r1+a[x]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
r1=r2=0;
query(1,1,n,x,n,1,v[x]);//cout<<r1<<' '<<r2<<endl;
cnt+=(r1+a[x]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
dlt(1,1,n,y,1);
r1=r2=0;
query(1,1,n,1,y,v[y],50000);//cout<<r1<<' '<<r2<<endl;
cnt+=(r1+a[y]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
r1=r2=0;
query(1,1,n,y,n,1,v[y]);//cout<<r1<<' '<<r2<<endl;
cnt+=(r1+a[y]*(r2-2)+mod)%mod;
cnt=(cnt+mod)%mod;
cout<<cnt<<endl;
}
return 0;
}
wa成30分求助