第 10 个点 MLE 了。
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed n,m,k;
int p[400000],tree[400000],a[550000];
signed o,l[550000],r[550000],ans[400000];
vector<signed>v[1050000];
vector<signed>s[300000];
queue<signed>ql,qr;
inline int lowbit(int x)
{
return x&-x;
}
inline void add(signed x,int k)
{
while(x<=m)
{
tree[x]+=k;
x+=lowbit(x);
}
}
inline void add1(signed x)
{
if(l[x]==0&&r[x]==0&&a[x]==0)
return;
if(l[x]<=r[x])
{
add(l[x],a[x]);
if(r[x]!=m)
add(r[x]+1,-a[x]);
}
else
{
add(1,a[x]);
add(r[x]+1,-a[x]);
add(l[x],a[x]);
}
}
inline int find(signed x)
{
int num=0;
while(x)
{
num+=tree[x];
x-=lowbit(x);
}
return num;
}
inline void check(signed x)
{
for(signed i=0;i<v[x].size();i++)
{
signed vec=v[x][i],num=0;
for(signed j=0;j<s[vec].size();j++)
{
num+=find(s[vec][j]);
if(num>=p[vec])
{
v[2*x].push_back(vec);
goto a1;
}
}
v[2*x+1].push_back(vec);
a1:;
}
}
inline void bfs()
{
for(signed i=1;i<=n;i++)
v[1].push_back(i);
ql.push(1),qr.push(k);
signed t=0,now=0;
while(!ql.empty())
{
signed l=ql.front(),r=qr.front();
ql.pop(),qr.pop();
t++;
if(l==r)
{
for(signed i=0;i<v[t].size();i++)
ans[v[t][i]]=l;
continue;
}
signed mid=(r+l-1)>>1;
if(now>mid)
{
memset(tree,0,sizeof(tree));
now=0;
}
while(now<mid)
{
now++;
add1(now);
}
check(t);
v[t].clear();
ql.push(l),qr.push(mid);
ql.push(mid+1),qr.push(r);
}
}
signed main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
cin>>n>>m;
for(signed i=1;i<=m;i++)
scanf("%d",&o),s[o].push_back(i);
for(signed i=1;i<=n;i++)
scanf("%lld",&p[i]);
cin>>k;
for(signed i=1;i<=k;i++)
scanf("%d%d%lld",&l[i],&r[i],&a[i]);
signed k1=k;
k=(1<<(signed)ceil(log(k+1)/log(2)));
bfs();
for(signed i=1;i<=n;i++)
if(ans[i]>k1)
cout<<"NIE\n";
else
cout<<ans[i]<<"\n";
return 0;
}