rt,虽然我觉得大概率是数组越界,我数组开到2e6还是寄,所以可能不是数组越界,那么是被卡常了?所以该怎么办QAQ
#include<bits/stdc++.h>
#define PII pair<int,int>
#define ll long long
#define fir first
#define sec second
using namespace std;
const int N=2e6+10;
int n,m;
vector<int> nums;
ll d;
struct Nd{
int l,r;ll mx,add;
}tr[N*4];
struct chal{
int l,r;ll p;
}a[N];
int find(int x){
return lower_bound(nums.begin(),nums.end(),x)-nums.begin();
}
void pushup(int u){
tr[u].mx=max(tr[u<<1].mx,tr[u<<1|1].mx);
}
void pushdown(int u){
Nd &rt=tr[u];
if(!rt.add) return;
Nd &lc=tr[u<<1],&rc=tr[u<<1|1];
lc.mx+=rt.add;rc.mx+=rt.add;
lc.add+=rt.add;rc.add+=rt.add;
rt.add=0;
}
void build(int u,int l,int r){
int mid=l+r>>1;
if(l==r){
tr[u]={l,r,0,0};
return;
}
tr[u]={l,r,0,0};
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
}
ll query(int u,int l,int r){
if(tr[u].l>r||tr[u].r<l) return 0;
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].mx;
pushdown(u);
return max(query(u<<1,l,r),query(u<<1|1,l,r));
}
void modify(int u,int l,int r,ll k){
if(tr[u].l>r||tr[u].r<l) return;
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].add+=k;
tr[u].mx+=k;
return;
}
pushdown(u);
modify(u<<1,l,r,k);
modify(u<<1|1,l,r,k);
pushup(u);
}
int k;
bool cmp(chal x,chal y){
return x.r<y.r;
}
signed main(){
int C,T;
scanf("%d%d",&C,&T);
while(T--){
scanf("%d%d%d%lld",&n,&m,&k,&d);
int l,r,p;nums.clear();
for(int i=1;i<=m;i++){
scanf("%d%d%d",&r,&l,&p);
l=r-l;
nums.push_back(l);
nums.push_back(r-k);
nums.push_back(r);
a[i]={l,r,p};
}
nums.push_back(0);
sort(nums.begin(),nums.end());
nums.erase(unique(nums.begin(),nums.end()),nums.end());
for(int i=1;i<=m;i++){
a[i].l=find(a[i].l);
a[i].r=find(a[i].r);
}
sort(a+1,a+m+1,cmp);
n=nums.size()-1;
build(1,0,n);ll res=0;p=1;
for(int i=1;i<=n;i++){
modify(1,0,i-1,-d*(nums[i]-nums[i-1]));
while(p<=m&&a[p].r==i) modify(1,0,a[p].l,a[p].p),p++;
res=max(res,query(1,find(nums[i]-k),i-1));
if(i+1<n) modify(1,i+1,i+1,res);
}
printf("%lld\n",res);
}
return 0;
}