RT,萌新刚学整体二分,全 WA 调不出来
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
template <typename T>
inline void read(T& r) {
r=0;bool w=0;
char ch=getchar();
while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
while(ch>='0'&&ch<='9') r=(r<<3)+(r<<1)+(ch^48), ch=getchar();
r=w?-r:r;
}
const int N=3e5+10;
#define lb (x&-x)
typedef long long ll;
int n,m,k,ans[N];
ll p[N],tre[N];
vector<int>o[N];
struct node{
int l,r,val,id;
}q[N<<1];
void add(int x,int val){
for(;x<=m;x+=lb)tre[x]+=val;
}
ll query(int x){
ll res=0;
for(;x;x-=lb)res+=tre[x];
return res;
}
void solve(int l,int r,vector<int>qr){
if(l==r){
for(int i:qr)ans[i]=q[l].id;
return;
}
int mid=l+r>>1;
vector<int>q1,q2;
for(int i=l;i<=mid;++i)add(q[i].l,q[i].val),add(q[i].r+1,-q[i].val);
for(int i:qr){
ll sum=0;
for(int j:o[i])sum+=query(j);
if(sum>=p[i])q1.push_back(i);
else p[i]-=sum,q2.push_back(i);
}
solve(l,mid,q1),solve(mid+1,r,q2);
}
int main(){
read(n),read(m);
vector<int>qr;
for(int i=1,x;i<=m;++i)read(x),o[x].push_back(i);
for(int i=1;i<=n;++i)read(p[i]),qr.push_back(i);
read(k);
int tot=0,l,r,a;
for(int i=1;i<=k;++i){
read(l),read(r),read(a);
if(l<=r){
q[++tot]=(node){l,r,a,i};
}else {
q[++tot]=(node){l,m,a,i};
q[++tot]=(node){1,r,a,i};
}
}
q[++tot]=(node){1,m,0x7fffffff,k+1};
solve(1,tot,qr);
for(int i=1;i<=n;++i){
if(ans[i]==k+1)printf("NIE\n");
else printf("%d\n",ans[i]);
}
return 0;
}