Submission #926318

#TimeUsernameProblemLanguageResultExecution timeMemory
926318AdamGSFire (JOI20_ho_t5)C++17
100 / 100
543 ms88132 KiB
#include<bits/stdc++.h> using namespace std; typedef long double ld; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() struct pas { ll x1, y1, x2, y2, d; }; const int LIM=2e5+7; ll T[LIM], dlu[LIM], kon[LIM], wynik[LIM], tr[4*LIM], lazy[4*LIM], N=1; vector<pair<ll,ll>>V; vector<pas>dod, pyt; void spl(int v) { tr[2*v]+=lazy[v]/2; tr[2*v+1]+=lazy[v]/2; lazy[2*v]+=lazy[v]/2; lazy[2*v+1]+=lazy[v]/2; lazy[v]=0; } void upd(int v, ll l, ll r, int a, int b, ll x) { if(b<l || r<a) return; if(a<=l && r<=b) { tr[v]+=(r-l+1)*x; lazy[v]+=(r-l+1)*x; return; } if(lazy[v]) spl(v); int mid=(l+r)/2; upd(2*v, l, mid, a, b, x); upd(2*v+1, mid+1, r, a, b, x); tr[v]=tr[2*v]+tr[2*v+1]; } ll cnt(int v, int l, int r, int a, int b) { if(b<l || r<a) return 0; if(a<=l && r<=b) return tr[v]; if(lazy[v]) spl(v); int mid=(l+r)/2; return cnt(2*v, l, mid, a, b)+cnt(2*v+1, mid+1, r, a, b); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; while(N<n) N*=2; rep(i, n) cin >> T[i]; vector<int>P; for(int i=n-1; i>=0; --i) { while(P.size() && T[P.back()]<T[i]) { dod.pb({P.back(), P.back()-i, P.back()+dlu[P.back()]-1, P.back()-i+dlu[P.back()]-1, -T[P.back()]}); V.pb({-i, -(int)dod.size()}); P.pop_back(); } if(P.size()) dlu[i]=P.back()-i; else dlu[i]=n-i; dod.pb({i, 0, i+dlu[i]-1, dlu[i]-1, T[i]}); V.pb({-i, -(int)dod.size()}); P.pb(i); } rep(i, q) { ll t, l, r; cin >> t >> l >> r; --l; --r; pyt.pb({r, t, i, 1, 0}); V.pb({t-r, pyt.size()}); if(l!=0) { pyt.pb({l-1, t, i, -1, 0}); V.pb({t-l+1, pyt.size()}); } } sort(all(V)); for(auto i : V) { int p=abs(i.nd)-1; if(i.nd<0) upd(1, 0, N-1, dod[p].x1, dod[p].x2, dod[p].d); else wynik[pyt[p].x2]+=cnt(1, 0, N-1, 0, pyt[p].x1)*pyt[p].y2; } rep(i, 2*N) tr[i]=lazy[i]=0; reverse(all(V)); for(auto i : V) { int p=abs(i.nd)-1; if(i.nd<0) upd(1, 0, N-1, dod[p].y1, dod[p].y2, dod[p].d); else wynik[pyt[p].x2]+=cnt(1, 0, N-1, 0, pyt[p].y1)*pyt[p].y2; } rep(i, q) cout << wynik[i] << '\n'; }
#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...