#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
using LL = long long;
const int MAX_V = 300001;
int p[MAX_V];
int l[MAX_V], r[MAX_V], a[MAX_V];
vector<int> pos[MAX_V];
LL bit[MAX_V];
void bit_clear() {
memset(bit, 0, sizeof(bit));
}
void bit_ins(int x, int v) {
for(; x < MAX_V; x += x & -x) {
bit[x] += v;
}
}
LL bit_query(int x) {
LL res = 0;
for(; x; x -= x & -x) {
res += bit[x];
}
return res;
}
void solve() {
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; i++) {
int o;
cin >> o;
pos[o].push_back(i);
}
for(int i = 1; i <= n; i++) {
cin >> p[i];
}
int k;
cin >> k;
for(int i = 1; i <= k; i++) {
cin >> l[i] >> r[i] >> a[i];
}
queue<tuple<int, int, vector<int>>> queries;
{
vector<int> ids;
for(int i = 1; i <= n; i++) {
ids.push_back(i);
}
queries.push({1, k + 1, ids});
}
int ptr = 0;
vector<int> ans(n + 1);
while(!queries.empty()) {
auto [low, hi, ids] = queries.front();
queries.pop();
if(low == hi) {
for(int id: ids) {
ans[id] = low;
}
continue;
}
int mid = low + (hi - low) / 2;
if(mid < ptr) {
bit_clear();
ptr = 0;
}
while(ptr < mid) {
ptr++;
bit_ins(l[ptr], a[ptr]);
bit_ins(r[ptr] + 1, -a[ptr]);
if(r[ptr] < l[ptr]) {
bit_ins(1, a[ptr]);
}
}
vector<int> small_id, big_id;
for(int id: ids) {
long long need = p[id];
for(int p: pos[id]) {
need -= bit_query(p);
if(need <= 0) break;
}
if(need <= 0) {
small_id.push_back(id);
} else {
big_id.push_back(id);
}
}
if(!small_id.empty()) {
queries.push({low, mid, small_id});
}
if(!big_id.empty()) {
queries.push({mid + 1, hi, big_id});
}
}
for(int i = 1; i <= n; i++) {
if(ans[i] > k) {
cout << "NIE\n";
}
else {
cout << ans[i] << "\n";
}
}
}
int main() {
cin.tie(0);
ios_base::sync_with_stdio(false);
solve();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
12892 KB |
Output is correct |
2 |
Correct |
4 ms |
12892 KB |
Output is correct |
3 |
Correct |
4 ms |
12892 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
13144 KB |
Output is correct |
2 |
Correct |
3 ms |
12892 KB |
Output is correct |
3 |
Correct |
4 ms |
12888 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
50 ms |
13356 KB |
Output is correct |
2 |
Correct |
104 ms |
14140 KB |
Output is correct |
3 |
Correct |
75 ms |
14152 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
87 ms |
13908 KB |
Output is correct |
2 |
Correct |
93 ms |
13848 KB |
Output is correct |
3 |
Correct |
99 ms |
14236 KB |
Output is correct |
4 |
Correct |
20 ms |
13876 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
86 ms |
13648 KB |
Output is correct |
2 |
Correct |
137 ms |
14680 KB |
Output is correct |
3 |
Correct |
41 ms |
12892 KB |
Output is correct |
4 |
Correct |
78 ms |
14388 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
36 ms |
13144 KB |
Output is correct |
2 |
Correct |
100 ms |
14008 KB |
Output is correct |
3 |
Correct |
61 ms |
13392 KB |
Output is correct |
4 |
Correct |
107 ms |
14956 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
567 ms |
19628 KB |
Output is correct |
2 |
Correct |
102 ms |
14688 KB |
Output is correct |
3 |
Correct |
313 ms |
15440 KB |
Output is correct |
4 |
Correct |
1040 ms |
39484 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
538 ms |
19100 KB |
Output is correct |
2 |
Correct |
451 ms |
14804 KB |
Output is correct |
3 |
Correct |
59 ms |
16340 KB |
Output is correct |
4 |
Correct |
1318 ms |
41300 KB |
Output is correct |