#include<bits/stdc++.h>
#define int long long
using namespace std;
auto mread = [](){
int x;
scanf("%lld", &x);
return x;
};
const int N = 3e5 + 5;
int n = mread(), m = mread(), belong[N], p[N], ans[N], a[N], k, t[N], t1[N], t2[N];
struct Node{
int l, r, a;
}s[N];
vector<int> v[N];
int lowbit(int x){
return x & (-x);
}
void add(int x, int k){
while(x <= m){
a[x] += k;
x += lowbit(x);
}
return;
}
int query(int x){
int ans = 0;
while(x){
ans += a[x];
x -= lowbit(x);
}
return ans;
}
void makeAns(int l, int r, int nl, int nr){
if(l == r){
for(int i = nl; i <= nr; i ++)
ans[t[i]] = l;
return;
}
int mid = (l + r) >> 1;
for(int i = 1; i <= mid; i ++){
if(s[i].l <= s[i].r){
add(s[i].l, s[i].a);
add(s[i].r + 1, -s[i].a);
}
else{
add(1, s[i].a);
add(s[i].r + 1, -s[i].a);
add(s[i].l, s[i].a);
}
}
int cnt1 = 0, cnt2 = 0;
for(int i = nl; i <= nr; i ++){
int x = t[i], s = 0;
for(int j = 0; j < v[x].size(); j ++){
int y = v[x][j];
s += query(y);
}
if(s >= p[x])
t1[++cnt1] = x;
else
t2[++cnt2] = x;
// printf("*** %lld %lld\n", x, s);
}
for(int i = 1; i <= mid; i ++){
if(s[i].l <= s[i].r){
add(s[i].l, -s[i].a);
add(s[i].r + 1, s[i].a);
}
else{
add(1, -s[i].a);
add(s[i].r + 1, s[i].a);
add(s[i].l, -s[i].a);
}
}
for(int i = nl; i <= nl + cnt1 - 1; i ++)
t[i] = t1[i - nl + 1];
for(int i = nr - cnt2 + 1, j = 1; i <= nr; i ++, j ++)
t[i] = t2[j];
makeAns(l, mid, nl, nl + cnt1 - 1);
makeAns(mid + 1, r, nr - cnt2 + 1, nr);
return;
}
signed main(){
for(int i = 1; i <= m; i ++){
belong[i] = mread();
v[belong[i]].push_back(i);
}
for(int i = 1; i <= n; i ++)
p[i] = mread(), t[i] = i;
k = mread();
for(int i = 1; i <= k; i ++)
s[i].l = mread(), s[i].r = mread(), s[i].a = mread();
vector<int> t;
for(int i = 1; i <= n; i ++)
t.push_back(i);
makeAns(1ll, k + 1, 1, n);
for(int i = 1; i <= n; i ++)
if(ans[i] == k + 1)
printf("NIE\n");
else
printf("%lld\n", ans[i]);
return 0;
}
复杂度应该是对的,两个log,但是除了前两个点都T了qwq。