按照第4篇题解写的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 300010;
const ll INF = 1e18;
ll n,m,k;
struct Question{
ll id,l,r,val;
} q[N];
struct Node{
ll id,dem;
};
Node p[N],p1[N],p2[N];
ll tree[N],ans[N];
vector<ll> core[N];
#define lowbit(x) (x&-x)
void add(ll id,ll x){
for(; id <= m; id+=lowbit(id)) tree[id]+=x;
}
ll query(ll id){
ll res = 0;
for(; id; id-=lowbit(id)) res+=tree[id];
return res;
}
ll read(){
ll x = 0,h = 1;
char ch = getchar();
while(!(ch=='-'||('0'<=ch&&ch<='9'))) ch = getchar();
if(ch=='-') h = -1;
else x = ch-'0';
ch = getchar();
while('0'<=ch&&ch<='9'){
x = x*10+ch-'0';
ch = getchar();
}
return x*h;
}
void solve(ll l,ll r,ll L,ll R){
if(L>R) return;
if(l==r){
//printf("[%lld,%lld]ans->%lld\n",L,R,l);
for(ll i = L; i <= R; i++) ans[p[i].id] = l;
return;
}
ll mid = (l+r)>>1,tot1 = 0,tot2 = 0;
//printf("考虑第 %lld 到 %lld 的修改操作与 p 上的 %lld->%lld 区间----------\n",l,r,L,R);
//printf("进行前一半操作...\n");
for(ll i = l; i <= mid; i++){
//printf("操作 %lld:[%lld,%lld]+%lld\n",i,q[i].l,q[i].r,q[i].val);
if(q[i].l>q[i].r){
add(q[i].l,q[i].val);
add(m+1,-q[i].val);
add(1,q[i].val);
add(q[i].r+1,-q[i].val);
} else {
add(q[i].l,q[i].val);
add(q[i].r+1,-q[i].val);
}
}
for(ll i = L; i <= R; i++){
//printf("p[%lld]: %lld 需求为 %lld\n",i,p[i].id,p[i].dem);
ll sum = 0;
for(auto v : core[p[i].id]){
//printf("核心 %lld:%lld\n",v,query(v));
sum+=query(v);
}
//printf("其核心地区总和 sum = %lld\n",sum);
if(p[i].dem<=sum) p1[++tot1] = p[i];
else p[i].dem-=sum,p2[++tot2] = p[i];
}
for(ll i = l; i <= mid; i++){
if(q[i].l>q[i].r){
add(q[i].l,-q[i].val);
add(m+1,q[i].val);
add(1,-q[i].val);
add(q[i].r+1,q[i].val);
} else {
add(q[i].l,-q[i].val);
add(q[i].r+1,q[i].val);
}
}
for(ll i = L; i <= L+tot1-1; i++) p[i] = p1[i-L+1];
for(ll i = L+tot1; i <= L+R; i++) p[i] = p2[i-L-tot1+1];
//printf("DONE-------[%lld,%lld](%lld,%lld)\n",l,r,L,R);
solve(l,mid,L,L+tot1-1);solve(mid+1,r,L+tot1,R);
}
int main(){
n = read(),m = read();
for(ll i = 1; i <= m; i++) core[read()].push_back(i);
for(ll i = 1; i <= n; i++) p[i].dem = read(),p[i].id = i;
k = read();
for(ll i = 1; i <= k; i++){
q[i].id = i;
q[i].l = read(),q[i].r = read(),q[i].val = read();
}
k++;
q[k].id = k;
q[k].l = 1,q[k].r = m,q[k].val = INF;
solve(1,k,1,n);
for(ll i = 1; i <= n; i++) if(ans[i]==k) puts("NIE"); else printf("%lld\n",ans[i]);
return 0;
}