利用树状数组修改一位数组(Blocks,记录每个塔的攻击范围),然后判断怪物出生的点会受到多少伤害
//leehaoze
#include <iostream>
#include <deque>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int INF = 1<<29;
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
#define ULL unsigned long long
#define MAXN (100000 + 5)
ULL block[MAXN];
int N,M,K;
ULL bit0[MAXN+1],bit1[MAXN+1];
ULL sum(ULL *b,int i){
ULL s = 0;
while(i > 0){
s += b[i];
i -= i & -i;
}
return s;
}
void add(ULL *b,int i,int v){
while(i <= N){
b[i] += v;
i += i & -i;
}
}
void Handle_Block(){
for (int i = N; i > 0; --i) {
ULL res = 0;
res += sum(bit0,N) + sum(bit1,N) * N;
res -= sum(bit0,i - 1) + sum(bit1,i - 1) * (i - 1);
block[i] = res;
}
}
bool Input(){
scanf("%d",&N);
if(N == 0)return false;
for (int i = 0; i <= N; ++i) {
block[i] = 0;
bit0[i] = 0;
bit1[i] = 0;
}
scanf("%d",&M);
for (int i = 0; i < M; ++i) {
int Li,Ri,Di;
scanf("%d%d%d",&Li,&Ri,&Di);
add(bit0,Li,-Di*(Li - 1));
add(bit1,Li,Di);
add(bit0,Ri + 1,Di * Ri);
add(bit1,Ri + 1,-Di);
}
Handle_Block();
scanf("%d",&K);
int left = 0;
for (int i = 0; i < K; ++i) {
ULL Hi,Xi;
scanf("%llu%llu",&Hi,&Xi);
if(Hi > block[Xi]){
left ++;
}
}
printf("%d\n",left);
return true;
}
int main() {
//freopen("IN.txt", "r", stdin);
while(Input()){
}
}