1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef pair<int,int> pii; typedef array<ll,3> arr; const ll MAXN=static_cast<ll>(2e5)+10,MINval=static_cast<ll>(-1e18)-10; ll N,Q,A[MAXN],sumA[MAXN],tr[MAXN]; inline ll lowbit(ll x) { return x&(-x); }
inline void change(ll p, ll x) { while (p<=N) { tr[p]=x; for(int i=1;i<lowbit(p);i<<=1) { tr[p]=max({tr[p-i],tr[p],x}); } p+=lowbit(p); } }
inline ll query(ll l,ll r) { ll res=MINval; while (l<=r) { if(r-lowbit(r)<l) { res=max(A[r]-sumA[r-1],res); r-=1; }else { res=max(tr[r],res); r-=lowbit(r); } } return res; } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>N>>Q; for(int i=1;i<=N;++i) { tr[i]=MINval; } for(int i=1;i<=N;++i) { cin>>A[i]; sumA[i]=sumA[i-1]+A[i]; change(i,A[i]-sumA[i-1]); }
for(int i=1;i<=Q;++i) { ll l,r; cin>>l>>r; if(l==r) {cout<<0<<'\n';continue;} cout<<max(query(l+1,r)+sumA[l-1],0LL)<<'\n'; } return 0; }
|