样例是过的,但是全 WA
悬关
#include<bits/stdc++.h>
#define M 50001
#define ls p<<1
#define rs p<<1|1
#define ll long long
using namespace std;
inline ll read()
{
ll k=0,f=0;char c=getchar();
for(;!isdigit(c);c=getchar()) f|=c=='-';
for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
return f?-k:k;
}
mt19937_64 rnd(time(0));
const ll mod=1e9+7;
ll n,m;
ll tr[M<<2],Node;
ll ans;
struct node
{
ll h,v;
}w[M<<4];
struct tree
{
ll lson,rson,h,val,tot,siz,key;
}t[M<<6];
inline void push_up(ll p)
{
t[p].siz=t[t[p].lson].siz+t[t[p].rson].siz+1,t[p].tot=t[t[p].lson].tot+t[t[p].rson].tot+t[p].val;
return;
}
inline void split(ll p,ll k,ll &x,ll &y)
{
if(!p)
{
x=0,y=0;
return;
}
if(t[p].h<=k) x=p,split(t[p].rson,k,t[p].rson,y);
else y=p,split(t[p].lson,k,x,t[p].lson);
push_up(p);
return;
}
inline ll merge(ll x,ll y)
{
if(!x) return y;
if(!y) return x;
if(t[x].key<=t[y].key)
{
t[x].rson=merge(t[x].rson,y),push_up(x);
return x;
}
else
{
t[y].lson=merge(x,t[y].lson),push_up(y);
return y;
}
}
inline void new_node(ll &p,node f)
{
p=++Node,t[p].lson=0,t[p].rson=0,t[p].h=f.h,t[p].val=t[p].tot=f.v,t[p].siz=1,t[p].key=rnd();
return;
}
inline void add(ll &root,node f)
{
ll x,y,z;
new_node(z,f),split(root,f.h,x,y),root=merge(merge(x,z),y);
return;
}
inline void del(ll &root,node f)
{
ll x,y,z;
split(root,f.h,x,y),split(x,f.h-1,x,z),root=merge(x,y);
return;
}
inline void modify(ll p,ll l,ll r,ll x,node a,node b)
{
if(a.h) add(tr[p],a);
if(b.h) del(tr[p],b);
if(l==r) return;
ll mid=(l+r)>>1;
if(x<=mid) modify(ls,l,mid,x,a,b);
else modify(rs,mid+1,r,x,a,b);
return;
}
inline void update(ll p,ll l,ll r,ll st,ll en,node a,node b)
{
if(st<=l&&r<=en)
{
ll x,y,z;
split(tr[p],a.h,x,y),split(x,a.h-1,x,z),ans=ans+(t[y].siz-t[x].siz)*a.v+t[y].tot-t[x].tot,ans=((ans+mod)%mod+mod)%mod,tr[p]=merge(merge(x,z),y);
split(tr[p],b.h,x,y),split(x,b.h-1,x,z),ans=ans+(t[x].siz-t[y].siz)*b.v+t[x].tot-t[y].tot,ans=((ans+mod)%mod+mod)%mod,tr[p]=merge(merge(x,z),y);
return;
}
ll mid=(l+r)>>1;
if(st<=mid) update(ls,l,mid,st,en,a,b);
if(en>mid) update(rs,mid+1,r,st,en,a,b);
return;
}
int main()
{
n=read(),m=read(),w[1].h=read(),w[1].v=read(),modify(1,1,n,1,w[1],w[0]);
for(ll i=2;i<=n;i++)
{
ll x,y;
w[i].h=read(),w[i].v=read(),split(tr[1],w[i].h,x,y),ans=ans+t[y].siz*w[i].v+t[y].tot,ans=((ans+mod)%mod+mod)%mod,tr[1]=merge(x,y),modify(1,1,n,i,w[i],w[0]);
}
while(m--)
{
ll x=read(),y=read();
if(x>y) swap(x,y);
if(x+1<=y-1) update(1,1,n,x+1,y-1,w[x],w[y]);
if(w[x].h>w[y].h) ans=ans-w[x].v-w[y].v,ans=((ans+mod)%mod+mod)%mod;
if(w[x].h<w[y].h) ans=ans+w[x].v+w[y].v,ans=((ans+mod)%mod+mod)%mod;
modify(1,1,n,x,w[y],w[x]),modify(1,1,n,y,w[x],w[y]),swap(w[x],w[y]),printf("%lld\n",((ans+mod)%mod+mod)%mod);
}
return 0;
}