Submission #1278926

#TimeUsernameProblemLanguageResultExecution timeMemory
1278926SSKMFFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
203 ms19880 KiB
#include <bits/stdc++.h> using namespace std; struct Nod { int64_t inceput , sfarsit , suma[2] , lazy; } arbore[400002]; inline Nod Combina (Nod& stanga , Nod& dreapta) { Nod rezultat; rezultat.inceput = stanga.inceput; rezultat.sfarsit = dreapta.sfarsit; rezultat.suma[0] = stanga.suma[0] + dreapta.suma[0] + max(dreapta.inceput - stanga.sfarsit , (int64_t)0); rezultat.suma[1] = stanga.suma[1] + dreapta.suma[1] + max(stanga.sfarsit - dreapta.inceput , (int64_t)0); rezultat.lazy = 0; return rezultat; } inline void Lazy_Update (const int nod , const int stanga , const int dreapta) { if (!arbore[nod].lazy) { return; } if (stanga != dreapta) { const int mijloc = (stanga + dreapta) >> 1; arbore[nod + ((mijloc - stanga + 1) << 1)].lazy += arbore[nod].lazy; arbore[nod + 1].lazy += arbore[nod].lazy; } arbore[nod].inceput += arbore[nod].lazy; arbore[nod].sfarsit += arbore[nod].lazy; arbore[nod].lazy = 0; } inline void Build (const int nod , const int stanga , const int dreapta) { if (stanga == dreapta) { int valoare; cin >> valoare; arbore[nod].inceput = arbore[nod].sfarsit = valoare; return; } const int mijloc = (stanga + dreapta) >> 1; Build(nod + 1 , stanga , mijloc); Build(nod + ((mijloc - stanga + 1) << 1) , mijloc + 1 , dreapta); arbore[nod] = Combina(arbore[nod + 1] , arbore[nod + ((mijloc - stanga + 1) << 1)]); } inline void Update (const int nod , const int stanga , const int dreapta , const int stanga_update , const int dreapta_update , const int valoare) { Lazy_Update(nod , stanga , dreapta); if (dreapta_update < stanga || dreapta < stanga_update) { return; } if (stanga_update <= stanga && dreapta <= dreapta_update) { arbore[nod].lazy = valoare; Lazy_Update(nod , stanga , dreapta); return; } const int mijloc = (stanga + dreapta) >> 1; Update(nod + 1 , stanga , mijloc , stanga_update , dreapta_update , valoare); Update(nod + ((mijloc - stanga + 1) << 1) , mijloc + 1 , dreapta , stanga_update , dreapta_update , valoare); arbore[nod] = Combina(arbore[nod + 1] , arbore[nod + ((mijloc - stanga + 1) << 1)]); } int main () { ios :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int limita , numar_operatii , factor_1 , factor_2; cin >> limita >> numar_operatii >> factor_1 >> factor_2; Build(1 , 0 , limita); while (numar_operatii--) { int stanga , dreapta , termen; cin >> stanga >> dreapta >> termen; Update(1 , 0 , limita , stanga , dreapta , termen); cout << arbore[1].suma[1] * factor_2 - arbore[1].suma[0] * factor_1 << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...