# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
942501 |
2024-03-10T18:48:53 Z |
Clan328 |
Meteors (POI11_met) |
C++17 |
|
0 ms |
0 KB |
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define nL '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define int long long
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;
const ll MOD = 1e9 + 7;
void settings()__attribute__((constructor));
void eval(bool condition) { cout << (condition ? "yes" : "no") << nL; }
void Eval(bool condition) { cout << (condition ? "Yes" : "No") << nL; }
void EVAL(bool condition) { cout << (condition ? "YES" : "NO") << nL; }
int ipow(int a, int n) {
if (n == 0) return 1;
int x = ipow(a, n/2);
if (n % 2 == 0) return x*x;
return x*x*a;
}
template <typename T>
ostream& operator<<(ostream& stream, const vector<T>& v) {
for (auto elem : v)
stream << elem << " ";
return stream;
}
template <typename T>
istream& operator>>(istream& stream, vector<T>& v){
for(auto &elem : v)
stream >> elem;
return stream;
}
void settings() {
#ifdef LOCAL
freopen("io/input.txt", "r", stdin);
freopen("io/output.txt", "w", stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);
}
struct Rain {
int l, r, a;
};
int LOG = 20;
struct SegmentTree {
vl t, lazy;
SegmentTree(int n) {
t = vl(4*n);
lazy = vl(4*n);
}
void push(int v) {
t[2*v] += lazy[v];
t[2*v+1] += lazy[v];
lazy[2*v] += lazy[v];
lazy[2*v+1] += lazy[v];
lazy[v] = 0;
}
void update(int v, int tl, int tr, int l, int r, int x) {
if (l > r) return;
if (l == tl && r == tr) {
t[v] += x;
lazy[v] += x;
return;
}
push(v);
int tm = (tl+tr)/2;
update(2*v, tl, tm, l, min(r, tm), x);
update(2*v+1, tm+1, tr, max(tm+1, l), r, x);
t[v] = max(t[2*v], t[2*v+1]);
}
ll get(int v, int tl, int tr, int l, int r) {
if (l > r) return 0;
if (l == tl && r == tr) return t[v];
push(v);
int tm = (tl+tr)/2;
return max(get(2*v, tl, tm, l, min(r, tm)), get(2*v+1, tm+1, tr, max(tm+1, l), r));
}
};
signed main() {
int n, m;
cin >> n >> m;
vi o(m);
cin >> o;
for (int i = 0; i < m; i++) o[i]--;
m *= 2;
for (int i = m/2; i < m; i++) o.pb(o[i-m/2]);
vi p(n);
cin >> p;
int k;
cin >> k;
vector<Rain> lr(k);
for (int i = 0; i < k; i++) {
cin >> lr[i].l >> lr[i].r >> lr[i].a;
lr[i].l--; lr[i].r--;
if (lr[i].r < lr[i].l) lr[i].r += m/2;
}
vvi c(n);
for (int i = 0; i < m; i++) {
c[o[i]].pb(i);
}
map<pair<int, pii>, vi> b;
for (int i = 0; i < n; i++) b[{k/2, {0, k}}].pb(i);
while (LOG--) {
SegmentTree tree(m);
int nxt = 0;
map<pair<int, pii>, vi> tmp;
for (auto [key, arr] : b) {
int l = key.second.first, r = key.second.second, mid = key.first;
for (int i = nxt; i <= min(k-1, mid); i++) {
tree.update(1, 0, m-1, lr[i].l, lr[i].r, lr[i].a);
nxt++;
}
for (auto u : arr) {
int sum = 0;
for (auto v : c[u]) {
sum += tree.get(1, 0, m-1, v, v);
}
// cout << u << " " << sum << " " <<r<< nL;
if (sum < p[u]) tmp[{(mid+1+r)/2, {mid+1, r}}].pb(u);
else if (sum > p[u]) tmp[{(l+mid)/2, {l, mid}}].pb(u);
else tmp[{mid, {mid, mid+1}}].pb(u);
}
}
b = tmp;
}
// cout << "----" << nL;
vi res(n, -1);
for (auto [key, arr] : b) {
for (auto u : arr) {
if (key.second.first == key.second.second && key.second.first < k)
res[u] = key.second.first+1;
// cout << u << " " << key.second.first << " " << key.second.second << nL;
}
}
for (int i = 0; i < n; i++) {
if (res[i] != -1) cout << res[i] << nL;
else cout << "NIE" << nL;
}
return 0;
}
Compilation message
<command-line>: error: expected unqualified-id before numeric constant
met.cpp:29:6: note: in expansion of macro 'EVAL'
29 | void EVAL(bool condition) { cout << (condition ? "YES" : "NO") << nL; }
| ^~~~