#include<bits/stdc++.h> using namespace std; const int maxn=10010; int s[maxn*4],col[maxn*4];//懒标记和线段树 void down(int p,int l,int r) { if(col[p])//当前节点有懒标记 { int mid=(l+r)/2; s[p*2]+=col[p]*(mid-l+1);//左区间元素个数乘以加上的值 s[p*2+1]+=col[p]*(r-mid);//右区间元素个数乘以加上的值 col[p*2]+=col[p]; col[p*2+1]+=col[p]; col[p]=0;//取消当前懒标记 } } void up(int p) { s[p]=s[p*2]+s[p*2+1]; } void modify(int p,int l,int r,int x,int y,int c) { if(l>=x&&r<=y)//找到了更新区间 { s[p]+=(r-l+1)*c;//闭区间所以+1 col[p]+=c;//打上懒标记 return; } down(p,l,r);//下放懒标记 int mid=(r+l)/2; if(x<=mid)//若目标在左区间 { modify(p*2,l,mid,x,y,c); } if(y>mid)//若目标在右区间 { modify(p*2+1,mid+1,r,x,y,c); } up(p);//回溯时向上更新 } int query(int p,int l,int r,int x,int y) { if(l>=x&&r<=y) { return s[p]; } down(p,l,r);//下放懒标记 int mid=(r+l)/2,res=0; if(x<=mid) { res+=query(p*2,l,mid,x,y); } if(y>mid) { res+=query(p*2+1,mid+1,r,x,y); }//答案有可能夹在两个区间之间 return res;//记得返回答案 } int main() { memset(s,0,sizeof(s)); memset(col,0,sizeof(col)); int n,t; cin>>n>>t;//区间1~n和修改数据组数 for(int i=1;i<=n;i++) { modify(1,1,n,i,i,0); } for(int i=1;i<=t;i++) { int a,b,c; cin>>a>>b>>c; modify(1,1,n,a,b,c); } int m;//查找数据组数 cin>>m; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; cout<<query(1,1,n,x,y)<<endl; } return 0; }