Submission #1187313

#TimeUsernameProblemLanguageResultExecution timeMemory
1187313epicci23Fish 2 (JOI22_fish2)C++20
100 / 100
1874 ms115372 KiB
#include "bits/stdc++.h" #define int long long #define all(v) v.begin() , v.end() #define sz(a) (int) a.size() using namespace std; // base impl ile baslayalim sonra gelistiririz adim adim const int N = 100005; int n, q, ar[N]; struct Info{ int sum, l, r; vector<int> il, ir, sl, sr, vl, vr; void init(int ind, int val){ sum = val; l = r = ind; il.clear(),ir.clear(),sl.clear(),sr.clear(),vl.clear(),vr.clear(); il.push_back(ind), ir.push_back(ind); sl.push_back(val), sr.push_back(val); vl.push_back(1), vr.push_back(1); } }; Info T[4 * N], BOS; Info merge(Info lf, Info rg){ // try ampersand?? if(lf.l == -1) return rg; if(rg.r == -1) return lf; Info res; res.sum = lf.sum + rg.sum; res.l = lf.l, res.r = rg.r; for(int i = 0; i < sz(lf.il); i++){ res.il.push_back(lf.il[i]); res.sl.push_back(lf.sl[i]); res.vl.push_back(0); } for(int i = 0; i < sz(rg.ir); i++){ res.ir.push_back(rg.ir[i]); res.sr.push_back(rg.sr[i]); res.vr.push_back(0); } int cur = lf.sum, p = 0; while(p < sz(rg.sl)){ if(cur < ar[rg.il[p]]){ res.il.push_back(rg.il[p]); res.sl.push_back(rg.sl[p]); res.vl.push_back(0); } else res.sl[sz(res.sl) - 1] += rg.sl[p]; cur += rg.sl[p++]; } cur = rg.sum, p = 0; while(p < sz(lf.sr)){ if(cur < ar[lf.ir[p]]){ res.ir.push_back(lf.ir[p]); res.sr.push_back(lf.sr[p]); res.vr.push_back(0); } else res.sr[sz(res.sr) - 1] += lf.sr[p]; cur += lf.sr[p++]; } int j = 0, pl = 0, pr = 0, sm = 0; for(int i = 0; i < sz(rg.il); i++){ // OPTIMIZE THIS!!!! if(i + 1 > pr) sm += rg.sl[pr++]; while(pl < sz(lf.ir) || pr < sz(rg.il)){ if(pl < sz(lf.ir) && sm >= ar[lf.ir[pl]]) sm += lf.sr[pl++]; else if(pr < sz(rg.il) && sm >= ar[rg.il[pr]]) sm += rg.sl[pr++]; else break; } if(pl < sz(lf.ir)) continue; for(;j < sz(res.il);){ if(j == sz(res.il) - 1 || sm < ar[res.il[j+1]]){ res.vl[j] += rg.vl[i]; break; } else j++; } } j = 0, pl = 0, pr = 0, sm = 0; for(int i = 0; i < sz(lf.ir); i++){ // OPTIMIZE THIS!!!! if(i + 1 > pl) sm += lf.sr[pl++]; while(pl < sz(lf.ir) || pr < sz(rg.il)){ if(pl < sz(lf.ir) && sm >= ar[lf.ir[pl]]) sm += lf.sr[pl++]; else if(pr < sz(rg.il) && sm >= ar[rg.il[pr]]) sm += rg.sl[pr++]; else break; } if(pl < sz(lf.ir)) continue; for(;j < sz(res.il);){ if(j == sz(res.il) - 1 || sm < ar[res.il[j+1]]){ res.vl[j] += lf.vr[i]; break; } else j++; } } j = 0, pl = 0, pr = 0, sm = 0; for(int i = 0; i < sz(lf.ir); i++){ // OPTIMIZE THIS!!!! if(i + 1 > pl) sm += lf.sr[pl++]; while(pl < sz(lf.ir) || pr < sz(rg.il)){ if(pl < sz(lf.ir) && sm >= ar[lf.ir[pl]]) sm += lf.sr[pl++]; else if(pr < sz(rg.il) && sm >= ar[rg.il[pr]]) sm += rg.sl[pr++]; else break; } if(pr < sz(rg.il)) continue; for(;j < sz(res.ir);){ if(j == sz(res.ir) - 1 || sm < ar[res.ir[j+1]]){ res.vr[j] += lf.vr[i]; break; } else j++; } } j = 0, pl = 0, pr = 0, sm = 0; for(int i = 0; i < sz(rg.il); i++){ // OPTIMIZE THIS!!!! if(i + 1 > pr) sm += rg.sl[pr++]; while(pl < sz(lf.ir) || pr < sz(rg.il)){ if(pl < sz(lf.ir) && sm >= ar[lf.ir[pl]]) sm += lf.sr[pl++]; else if(pr < sz(rg.il) && sm >= ar[rg.il[pr]]) sm += rg.sl[pr++]; else break; } if(pr < sz(rg.il)) continue; for(;j < sz(res.ir);){ if(j == sz(res.ir) - 1 || sm < ar[res.ir[j+1]]){ res.vr[j] += rg.vl[i]; break; } else j++; } } for(int i = 0; i + 1 < sz(lf.il); i++) res.vl[i] += lf.vl[i]; for(int i = 0; i + 1 < sz(rg.ir); i++) res.vr[i] += rg.vr[i]; return res; } void build(int rt, int l, int r){ if(l == r){ T[rt].init(l, ar[l]); return; } int mid = (l + r) / 2; build(rt * 2, l, mid), build(rt * 2 + 1, mid + 1, r); T[rt] = merge(T[rt * 2], T[rt * 2 + 1]); /*cout << "bura nasil : " << l << ' ' << r << '\n'; cout << "pree\n"; for(int i = 0; i < sz(T[rt].vl); i++){ cout << "bakalimm : " << i << '\n'; cout << T[rt].il[i] << ' ' << T[rt].sl[i] << ' ' << T[rt].vl[i] << '\n'; } cout << "suff\n"; for(int i = 0; i < sz(T[rt].vr); i++){ cout << "bakalimm : " << i << '\n'; cout << T[rt].ir[i] << ' ' << T[rt].sr[i] << ' ' << T[rt].vr[i] << '\n'; }*/ } void upd(int rt,int l,int r,int ind){ if(r < ind || l > ind) return; if(l == r){ T[rt].init(l, ar[l]); return; } int mid = (l + r) / 2; upd(rt * 2, l, mid, ind), upd(rt * 2 + 1, mid + 1, r, ind); T[rt] = merge(T[rt * 2], T[rt * 2 + 1]); } Info Query(int rt, int l, int r, int gl, int gr){ //cout << "neredeyim : " << l << ' ' << r << '\n'; if(r < gl || l > gr) return BOS; if(l >= gl && r <= gr) return T[rt]; int mid = (l + r) / 2; Info CUR = merge(Query(rt * 2, l, mid, gl, gr), Query(rt * 2 + 1, mid + 1, r, gl, gr)); /*cout << "gel gel : " << l << ' ' << r << '\n'; cout << "ranges : " << CUR.l << ' ' << CUR.r << '\n'; cout << "tot : " << CUR.sum << '\n'; cout << "pree\n"; for(int i = 0; i < sz(CUR.vl); i++){ cout << "bakalimm : " << i << '\n'; cout << CUR.il[i] << ' ' << CUR.sl[i] << ' ' << CUR.vl[i] << '\n'; } cout << "suff\n"; for(int i = 0; i < sz(CUR.vr); i++){ cout << "bakalimm : " << i << '\n'; cout << CUR.ir[i] << ' ' << CUR.sr[i] << ' ' << CUR.vr[i] << '\n'; }*/ return CUR; } void _(){ cin >> n; for(int i=1;i<=n;i++) cin >> ar[i]; build(1,1,n); BOS.init(-1, -1); cin >> q; while(q--){ int op; cin >> op; if(op == 1){ int ind, val; cin >> ind >> val; ar[ind] = val; upd(1,1,n,ind); } else{ int l, r; cin >> l >> r; Info X = Query(1,1,n,l,r); cout << X.vl.back() << '\n'; } } } int32_t main(){ cin.tie(0); ios::sync_with_stdio(0); int tc=1;//cin >> tc; while(tc--) _(); return 0; }
#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...