显示代码纯文本
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define ls(x) (a[x].lc)
#define rs(x) (a[x].rc)
#define LL long long
const int maxn=250000;
struct Node{
int lc,rc;LL date;
}a[maxn*22];
struct Date{
int earn,level,limit;
bool operator < (const Date & a)const{
return level<a.level;
}
}q[maxn];
int n,m,cnt;LL ans;
int level[maxn],limit[maxn],root[maxn];
void Insert(int x,int add,int & rt,int l,int r){
a[++cnt]=a[rt];rt=cnt;
a[rt].date+=add;
if(l==r)return;
int mid=(l+r)>>1;
if(x<=mid)Insert(x,add,ls(rt),l,mid);
else Insert(x,add,rs(rt),mid+1,r);
}
LL Query(int s,int t,int pr,int rt,int l,int r){
if(s>t)return 0;//不加T成xiang
if(s<=l && t>=r)return a[rt].date-a[pr].date;
int mid=(l+r)>>1;
if(t<=mid)return Query(s,t,ls(pr),ls(rt),l,mid);
if(s>mid)return Query(s,t,rs(pr),rs(rt),mid+1,r);
return Query(s,t,ls(pr),ls(rt),l,mid)+Query(s,t,rs(pr),rs(rt),mid+1,r);
}
void Init();
int main(){
//freopen("test.in","r",stdin);freopen("test.out","w",stdout);
//system("fc test.out test.ans");
freopen("hunguiwei.in","r",stdin);freopen("hunguiwei.out","w",stdout);
while(scanf("%d",&n)!=EOF)Init();
getchar();getchar();
return 0;
}
void Init(){
cnt=0;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&q[i].earn,&q[i].level,&q[i].limit);
limit[i]=q[i].limit;
level[i]=q[i].level;
}
sort(limit+1,limit+n+1);
sort(level+1,level+n+1);
sort(q+1,q+n+1);
for(int i=1;i<=n;i++){
int x=lower_bound(limit+1,limit+n+1,q[i].limit)-limit;
root[i]=root[i-1];
Insert(x,q[i].earn,root[i],1,n);
}
scanf("%d",&m);ans=0;
for(int i=1;i<=m;i++){
//printf("%d ",i);
LL level_l,level_r,limit_l,limit_r;
scanf("%lld%lld%lld%lld",&level_l,&level_r,&limit_l,&limit_r);
level_l+=ans;level_r-=ans;if(level_l>level_r)swap(level_l,level_r);
limit_l+=ans;limit_r-=ans;if(limit_l>limit_r)swap(limit_l,limit_r);
int pr=lower_bound(level+1,level+n+1,level_l)-level;
int rt=upper_bound(level+1,level+n+1,level_r)-level-1;
int s=lower_bound(limit+1,limit+n+1,limit_l)-limit;
int t=upper_bound(limit+1,limit+n+1,limit_r)-limit-1;
ans=Query(s,t,root[pr-1],root[rt],1,n);
printf("%lld\n",ans);
}
}