Submission #546367

#TimeUsernameProblemLanguageResultExecution timeMemory
546367ivan_tudorFish 2 (JOI22_fish2)C++14
100 / 100
1366 ms74296 KiB
#include <iostream> #include<bits/stdc++.h> using namespace std; struct stuck{ int i; long long a; long long sum; int candi; }; struct aint_node{ vector<stuck> pref; vector<stuck> suf; long long sum; int answer; }; const long long INF = LLONG_MAX; aint_node join(aint_node l, aint_node r, int litv, int ritv){ aint_node root; root.sum = l.sum + r.sum; /// folosim l.suf, r.pref int isuf = 0, jpref = 0; int candidates = 0; long long csum = 0; vector<int> newlscand(l.suf.size()); vector<int> newrpcand(r.pref.size()); stuck left = l.suf[0], right = r.pref[0]; while(true ){ if(isuf + 1 >= l.suf.size() && jpref + 1 >= r.pref.size()) break; if(isuf + 1 < l.suf.size() && jpref + 1 < r.pref.size()){ if(l.suf[isuf].a <= r.pref[jpref].a){ isuf++; left = l.suf[isuf]; candidates += left.candi; } else{ jpref++; right = r.pref[jpref]; candidates += right.candi; } } else{ if(isuf + 1 < l.suf.size()){ isuf++; left = l.suf[isuf]; candidates += left.candi; } else if(jpref + 1 < r.pref.size()){ jpref++; right = r.pref[jpref]; candidates += right.candi; } } csum = left.sum + right.sum; /// pana aici am ajuns if(left.i == litv - 1){ newrpcand[jpref] = candidates; } if(right.i == ritv + 1){ newlscand[isuf] = candidates; } if(csum < min(left.a, right.a) && min(left.a, right.a) < INF) candidates = 0; } root.answer = candidates; ///todothis root.pref = l.pref; root.pref.pop_back(); for(int i = 0; i < r.pref.size(); i++){ stuck x = r.pref[i]; if(x.a > x.sum + l.sum){ root.pref.push_back({x.i, x.a, x.sum + l.sum, newrpcand[i] }); } } //root.pref.push_back({ritv + 1, INF, root.sum, root.answer}); root.suf = r.suf; root.suf.pop_back(); /// cel de la margine for(int i = 0; i < l.suf.size(); i++){ stuck x = l.suf[i]; if(x.a > x.sum + r.sum){ root.suf.push_back({x.i, x.a, x.sum + r.sum, newlscand[i]}); } } return root; } aint_node build(int poz, int val){ aint_node rsp; rsp.sum = val; rsp.answer = 1; rsp.pref.push_back({poz, val, 0, 0}); rsp.pref.push_back({poz + 1, INF, val, 1}); rsp.suf.push_back({poz, val, 0, 0}); rsp.suf.push_back({poz - 1, INF, val, 1}); return rsp; } const int N = 100005; aint_node aint[4*N]; int v[N]; void build_aint(int nod, int l, int r){ if(l == r){ aint[nod] = build(l, v[l]); return; } int mid = (l + r)/2; build_aint(2*nod, l, mid); build_aint(2*nod + 1, mid + 1, r); aint[nod] = join(aint[2*nod], aint[2*nod + 1], l, r); } void update(int nod, int l, int r, int poz, int val){ if(poz > r || poz < l) return; if(l == r){ aint[nod] = build(poz, val); return; } int mid = (l + r)/2; update(2*nod, l, mid, poz, val); update(2*nod + 1, mid + 1, r, poz, val); aint[nod] = join(aint[2*nod], aint[2*nod + 1], l, r); } aint_node query(int nod, int l, int r, int ql, int qr){ if(ql <= l && r <= qr) return aint[nod]; int mid = (l + r)/2; if(qr <= mid){ return query(2*nod, l, mid, ql, qr); } if(ql >= mid + 1){ return query(2*nod + 1, mid + 1, r, ql, qr); } aint_node ls = query(2*nod, l, mid, ql, mid); aint_node rs = query(2*nod + 1, mid + 1, r, mid + 1, qr); return join(ls, rs, ql, qr); } int main() { int n; cin>>n; for(int i = 1; i<=n; i++) cin>>v[i]; build_aint(1, 1, n); int q; cin>>q; for(int i = 1; i<=q; i++){ int t; cin>>t; if(t == 1){ int poz, val; cin>>poz>>val; update(1, 1, n, poz, val); } else{ int l, r; cin>>l>>r; aint_node rsp = query(1, 1, n, l, r); cout<<rsp.answer<<"\n"; } } return 0; }

Compilation message (stderr)

fish2.cpp: In function 'aint_node join(aint_node, aint_node, int, int)':
fish2.cpp:28:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     if(isuf + 1 >= l.suf.size() && jpref + 1 >= r.pref.size())
      |        ~~~~~~~~~^~~~~~~~~~~~~~~
fish2.cpp:28:46: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |     if(isuf + 1 >= l.suf.size() && jpref + 1 >= r.pref.size())
      |                                    ~~~~~~~~~~^~~~~~~~~~~~~~~~
fish2.cpp:30:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |   if(isuf + 1 < l.suf.size() && jpref + 1 < r.pref.size()){
      |      ~~~~~~~~~^~~~~~~~~~~~~~
fish2.cpp:30:43: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |   if(isuf + 1 < l.suf.size() && jpref + 1 < r.pref.size()){
      |                                 ~~~~~~~~~~^~~~~~~~~~~~~~~
fish2.cpp:43:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |    if(isuf + 1 < l.suf.size()){
      |       ~~~~~~~~~^~~~~~~~~~~~~~
fish2.cpp:48:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |    else if(jpref + 1 < r.pref.size()){
      |            ~~~~~~~~~~^~~~~~~~~~~~~~~
fish2.cpp:68:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   for(int i = 0; i < r.pref.size(); i++){
      |                  ~~^~~~~~~~~~~~~~~
fish2.cpp:77:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<stuck>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |   for(int i = 0; i < l.suf.size(); i++){
      |                  ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...