rt,可能写的有些混乱
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int a[N], n, k, tag[4*N], tree[4*N], aa[N];
struct node
{
int l, r, c, t;
}s[4*N];
void pushup(int cur)
{
tree[cur]=tree[cur*2]+tree[cur*2+1];
}
void addtag(int cur, int lt, int rt, int val)
{
tree[cur]+=(rt-lt+1)*val;
tag[cur]+=val;
}
void pushdown(int cur, int lt, int rt)
{
if(!tag[cur])return ;
int mid=(lt+rt)>>1;
addtag(cur*2,lt,mid,tag[cur]);
addtag(cur*2+1,mid+1,rt,tag[cur]);
tag[cur]=0;
return ;
}
void build(int cur, int lt, int rt)
{
if(lt==rt)
{
tree[cur]=a[lt];
return ;
}
int mid=(lt+rt)>>1;
build(cur*2,lt,mid);
build(cur*2+1,mid+1,rt);
pushup(cur);
}
int query(int cur, int lt, int rt, int qx, int qy)
{
if(qy<lt||qx>rt)
{
return 0;
}
if(lt>=qx&&rt<=qy)
{
return tree[cur];
}
pushdown(cur,lt,rt);
int mid=(lt+rt)>>1;
return query(cur*2,lt,mid,qx,qy)+query(cur*2+1,mid+1,rt,qx,qy);
}
void update(int cur, int lt, int rt, int qx, int qy, int val)
{
if(qy<lt||qx>rt)
{
return ;
}
if(lt>=qx&&rt<=qy)
{
addtag(cur,lt,rt,val);
return ;
}
pushdown(cur,lt,rt);
int mid=(lt+rt)>>1;
update(cur*2,lt,mid,qx,qy,val);
update(cur*2+1,mid+1,rt,qx,qy,val);
pushup(cur);
}
bool cmp(node x, node y)
{
return x.r<y.r;
}
signed main()
{
int t;
cin>>t;
while(t--)
{
memset(tree,0,sizeof tree);
memset(tag,0,sizeof tag);
memset(aa,0,sizeof aa);
cin>>n>>k;
for(int i=1;i<=n;i++){cin>>a[i];aa[i]=a[i];}
sort(a+1,a+1+n);
build(1,1,n);
for(int i=1;i<=k;i++)
{
cin>>s[i].l>>s[i].r>>s[i].t;
s[i].l=lower_bound(a+1,a+n+1,s[i].l)-a;
s[i].r=upper_bound(a+1,a+n+1,s[i].r)-a-1;
if(s[i].r==0)k--, i--;
}
sort(s+1,s+1+k,cmp);
for(int i=1;i<=k;i++)
{
int l=s[i].l,r=s[i].r;
if(query(1,1,n,l,r)>=s[i].t)
{
continue;
}
if(r-l+1==s[i].t)
{
update(1,1,n,l,r,1);
continue;
}
int lt=l, rt=r-1;
while(lt<rt)
{
int mid=(lt+rt)>>1;
int x=query(1,1,n,l,mid);
if(x+r-mid>s[i].t)
{
lt=mid+1;
}
else rt=mid;
}
update(1,1,n,lt+1,r,1);
}
cout<<n-query(1,1,n,1,n)<<"\n";
}
}