《过不了样例》
#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+10;
int a[N],v[N];
struct node{
int t,idx,val,v;
}d[N*10];
int tot;
int n,m;
bool cmp(node a,node b){
return a.t < b.t || (a.t == b.t && a.idx < b.idx) || (a.t == b.t && a.idx == b.idx && a.val < b.val);
}
bool cmp1(node a,node b){
return a.idx < b.idx || (a.val < b.val && a.idx == b.idx);
}
bool cmp2(node a,node b){
return a.idx > b.idx || (a.val < b.val && a.idx == b.idx);
}
struct tlist{
long long tre[N];
int lowbit(int x){
return x&(-x);
}
void update(int p,int val){
for(int i = p;i <= n;i+=lowbit(i)){
tre[i] += val;
}
}
int query(int p){
int res = 0;
for(int i = p;i>=1;i-=lowbit(i)){
res += tre[i];
}
return res;
}
} tl1,tl2;
long long ans[N];
void solve(int l,int r){
if(l == r){
return;
}
int mid = (l+r)/2;
solve(l,mid);
solve(mid+1,r);
sort(d+l,d+mid+1,cmp1);
sort(d+mid+1,d+r+1,cmp1);
int p = l;
for(int i = mid+1;i<=r;i++){
while(p <= mid && d[p].idx < d[i].idx){
tl1.update(d[p].val,d[p].v);
tl2.update(d[p].val,1);
p++;
}
ans[d[i].t] += tl1.query(n) - tl1.query(d[i].val) + (tl2.query(n) - tl2.query(d[i].val))*d[i].v;
}
for(int i = l;i < p;i++){
tl1.update(d[i].val,-d[i].v);
tl2.update(d[i].val,-1);
}
sort(d+l,d+mid+1,cmp2);
sort(d+mid+1,d+r+1,cmp2);
p = l;
for(int i = mid+1;i<=r;i++){
while(p <= mid && d[p].idx > d[i].idx){
tl1.update(d[p].val,d[p].v);
tl2.update(d[p].val,1);
p++;
}
ans[d[i].t] += tl1.query(d[i].val - 1) + (tl2.query(d[i].val - 1))*d[i].v;
}
for(int i = l;i < p;i++){
tl1.update(d[i].val,-d[i].v);
tl2.update(d[i].val,-1);
}
}
int main(){
cin>>n>>m;
for(int i = 1;i<=n;i++){
cin>>a[i]>>v[i];
d[++tot] = {0,i,a[i],v[i]};
}
for(int i = 1;i<=m;i++){
int p1,p2;
cin>>p1>>p2;
d[++tot] = {i,p1,a[p1],-v[p1]};
d[++tot] = {i,p1,a[p2],v[p2]};
d[++tot] = {i,p2,a[p2],-v[p2]};
d[++tot] = {i,p2,a[p1],v[p1]};
swap(a[p1],a[p2]);
swap(v[p1],v[p2]);
}
sort(d+1,d+1+tot,cmp);
solve(1,tot);
long long sum = ans[0];
for(int i = 1;i<=n;i++){
sum+=ans[i];
cout<<sum<<'\n';
}
}