Nawet taki krótki kod z drzewem przedział-przedział dostaje ac.
#include <iostream> #include <vector> using namespace std; typedef long long ll; int n = 0, q = 0, l = 0, p = 0, val = 0, base = (1 << 19), rozmiar_drzewa = base * 2; vector<int> A; vector<ll> tree; vector<ll> tree2; inline void preprocesing() { tree.assign(rozmiar_drzewa,1e18+50); tree2.assign(rozmiar_drzewa,0); for (int i = 2; i <= n; ++i) tree[i-1+base] = A[i] - A[i/2]; for (int i = base-1; i >= 1; --i) tree[i] = min(tree[i*2],tree[i*2+1]); } inline void sprawdzaj() { if (tree[1] >= 0) cout << "TAK" << '\n'; else cout << "NIE" << '\n'; } inline void dodaj(int l_zap, int p_zap, int l_kontrolowana, int p_kontrolowana, int v, int val) { if (l_kontrolowana > p_zap or p_kontrolowana < l_zap) return; else if (l_kontrolowana >= l_zap and p_kontrolowana <= p_zap) { tree[v] += val; tree2[v] += val; } else { tree[v*2] += tree2[v]; tree[v*2+1] += tree2[v]; tree2[v*2] += tree2[v]; tree2[v*2+1] += tree2[v]; tree2[v] = 0; int srod = (p_kontrolowana - l_kontrolowana + 1) / 2; dodaj(l_zap,p_zap,l_kontrolowana,l_kontrolowana + srod - 1,v*2,val); dodaj(l_zap,p_zap,l_kontrolowana + srod,p_kontrolowana,v*2+1,val); tree[v] = min(tree[v*2],tree[v*2+1]); } } inline void update() { cin >> l >> p >> val; dodaj(l-1,p-1,0,base-1,1,val); dodaj(min(base,l*2-1),min(base,p*2),0,base-1,1,-val); } inline void wypisz_drzewo() { for (int i = 1; i < rozmiar_drzewa; ++i) cout << tree[i] << " "; cout << endl; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; A.assign(n+1,-1); for (int i = 1; i <= n; ++i) cin >> A[i]; preprocesing(); sprawdzaj(); cin >> q; while(q--) { update(); sprawdzaj(); } return 0; }
93,385 zapytań
142,383 odpowiedzi
322,540 komentarzy
62,745 pasjonatów
Motyw:
Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡
Oto polecana książka warta uwagi.Pełną listę książek znajdziesz tutaj