极限数据拍了半个小时全过,但30分
#include<bits/stdc++.h>
using namespace std;
const int szl=2*5e4+5,mod=1e9+7,inf=1e5;
int n,m,root[szl],tot,a[szl],v[szl];
long long ans;
struct Node{
int ls,rs,num;
long long val;
#define ls(x) sgt[x].ls
#define rs(x) sgt[x].rs
#define num(x) sgt[x].num
#define val(x) sgt[x].val
}sgt[szl*400];
inline void Up(int p){
val(p)=(val(ls(p))+val(rs(p)))%mod;
num(p)=(num(ls(p))+num(rs(p)))%mod;
return;
}
int bin[szl*400];
inline void Del(int &mem){
sgt[mem]={0,0,0,0};
bin[++bin[0]]=mem;
mem=0;
return;
}
inline int New(){
return bin[0]?bin[bin[0]--]:++tot;
}
int Pick(int p,int L,int R,int val,int l=1,int r=inf){
if(!p)return 0;
if(r<L||l>R)return 0;
if(L<=l&&r<=R)return (val(p)+num(p)*val)%mod;
int mid=l+r>>1;
return (1ll*Pick(ls(p),L,R,val,l,mid)+Pick(rs(p),L,R,val,mid+1,r))%mod;
}
void Prune(int &p,int pos,int val,int l=1,int r=inf){
if(!p)p=New();
if(l==r){
val(p)=(val(p)+val)%mod,num(p)+=val/abs(val);
if(!num(p))Del(p);
return;
}
int mid=l+r>>1;
if(pos<=mid)Prune(ls(p),pos,val,l,mid);
else Prune(rs(p),pos,val,mid+1,r);
Up(p);
if(!num(p))Del(p);
return;
}
inline void Add(int x,int y,int val){
for(register int i=x;i<=n;i+=i&-i)Prune(root[i],y,val);
return;
}
inline void Chan(int i,int f){
return Add(i,a[i],f*v[i]);
}
inline int Ask(int x,int pos,int val){
long long sum=0;
for(register int i=x;i;i-=i&-i)sum=(sum+Pick(root[i],1,pos,val))%mod;
return sum;
}
inline int Value(int x){
return (1ll*Ask(x-1,inf,v[x])-Ask(x-1,a[x],v[x])+Ask(n,a[x]-1,v[x])-Ask(x,a[x]-1,v[x])+mod)%mod;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(register int i=1;i<=n;i++){
cin>>a[i]>>v[i];
Chan(i,1);
ans+=Value(i);
ans=(ans+mod)%mod;
}
// cout<<ans<<"!!";
for(register int i=1;i<=m;i++){
int x,y;cin>>x>>y;
if(x==y){
cout<<ans<<endl;
continue;
}
if(x>y)swap(x,y);
ans-=Value(x),Chan(x,-1);
ans=(ans+mod)%mod;
ans-=Value(y),Chan(y,-1);
ans=(ans+mod)%mod;
swap(a[x],a[y]),swap(v[x],v[y]);
Chan(x,1),ans+=Value(x);
ans=(ans+mod)%mod;
Chan(y,1),ans+=Value(y);
ans=(ans+mod)%mod;
cout<<ans<<endl;
}
return 0;
}