rt
#include<bits/stdc++.h>
#define MAXN 600005
#define inf 1000000000
using namespace std;
inline long long read(){
long long x=0;
char c=getchar();
while(c<'0' || c>'9'){
c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x;
}
int n,m,k;
long long c[MAXN];
vector<int> edge[MAXN];
struct node1{
int l,r;
long long val;
}a[MAXN];
struct node2{
long long nd;
int id;
}p[MAXN],tmp[MAXN];
int ans[MAXN];
int lowbit(int x){
return x&(-x);
}
void update(int x,long long v){
while(x<=2*m){
c[x]+=v;
x+=lowbit(x);
}
}
long long query(int x){
long long res=0;
while(x){
res+=c[x];
x-=lowbit(x);
}
return res;
}
void whole_bny(int l,int r,int ql,int qr){
if(qr<ql) return;
if(l==r){
for(int i=ql;i<=qr;i++){
ans[p[i].id]=l;
}
return;
}
int mid=(l+r)>>1;
for(int i=l;i<=mid;i++){
update(a[i].l,a[i].val);
update(a[i].r+1,-a[i].val);
}
int cnt1=0,cnt2=n;
for(int i=ql;i<=qr;i++){
long long sum=0;
for(auto y:edge[p[i].id]){
sum+=query(y)+query(y+m);
if(sum>p[i].nd) break;
}
if(sum>=p[i].nd){
tmp[++cnt1]=p[i];
}else{
tmp[++cnt2]=p[i];
tmp[cnt2].nd-=sum;
}
}
for(int i=l;i<=mid;i++){
update(a[i].l,-a[i].val);
update(a[i].r+1,a[i].val);
}
for(int i=1;i<=cnt1;i++){
p[ql+i-1]=tmp[i];
}
for(int i=n+1;i<=cnt2;i++){
p[ql+cnt1+i-n-1]=tmp[i];
}
whole_bny(l,mid,ql,ql+cnt1-1);
whole_bny(mid+1,r,ql+cnt1,qr);
}
int main(){
n=read();m=read();
int o;
for(int i=1;i<=m;i++){
o=read();
edge[o].push_back(i);
}
for(int i=1;i<=n;i++){
p[i].nd=read();
p[i].id=i;
}
k=read();
for(int i=1;i<=k;i++){
a[i].l=read();
a[i].r=read();
a[i].val=read();
if(a[i].r<a[i].l) a[i].r+=m;
}
whole_bny(1,k+1,1,n);
for(int i=1;i<=n;i++){
if(ans[i]>k){
puts("NIE");
}else{
printf("%d\n",ans[i]);
}
}
return 0;
}
之前一直90pts调不出来 但在统计陨石数量的部分加上 if(sum>p[i].nd) break;就莫名可以了 但又想了想没看出来有什么本质区别 有没有佬教教QwQ