#include<bits/stdc++.h> using namespace std; int n,q,l,r,piterek,karm,ter; bool rozw[300002]; long long k,a[300002],pref[300002],depe[300002],odp[300002]; vector<pair<int,int>>poczatek[300002]; vector<pair<int,pair<int,int>>>koniec[300002]; int main() { scanf("%d%lld%d",&n,&k,&q); for(int i=1;i<=n;++i) { scanf("%lld",&a[i]); pref[i]=pref[i-1]+a[i]; } for(int kar=0;kar<q;++kar) { scanf("%d%d",&l,&r); poczatek[l].push_back(make_pair(r,kar)); koniec[r].push_back(make_pair(0,make_pair(l,kar))); } for(int sal=1;sal<=n;++sal) { if(poczatek[sal].size()>=2) { sort(poczatek[sal].begin(),poczatek[sal].end()); piterek=0; karm=poczatek[sal].size(); ter=sal; depe[sal-1]=0; while(piterek<karm) { depe[ter]=depe[ter-1]; if(ter-k+1>=sal) depe[ter]=max(depe[ter],depe[ter-k]+pref[ter]-pref[ter-k]); while(piterek<karm) { if(ter!=poczatek[sal][piterek].first) break; rozw[poczatek[sal][piterek].second]=1; odp[poczatek[sal][piterek].second]=depe[ter]; ++piterek; } ++ter; } } piterek=0; ter=sal; depe[sal+1]=0; for(int i=koniec[sal].size()-1;i>=0;--i) { if(rozw[koniec[sal][i].second.second]==1) { koniec[sal][i].first=1; } else ++piterek; } --piterek; sort(koniec[sal].begin(),koniec[sal].end()); while(piterek>=0) { depe[ter]=depe[ter+1]; if(ter+k-1<=sal) depe[ter]=max(depe[ter],depe[ter+k]+pref[ter+k-1]-pref[ter-1]); while(piterek>=0) { if(ter!=koniec[sal][piterek].second.first) break; rozw[koniec[sal][piterek].second.second]=1; odp[koniec[sal][piterek].second.second]=depe[ter]; --piterek; } --ter; } } for(int kar=0;kar<q;++kar) { printf("%lld\n",odp[kar]); } return 0; }
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 | #include<bits/stdc++.h> using namespace std; int n,q,l,r,piterek,karm,ter; bool rozw[300002]; long long k,a[300002],pref[300002],depe[300002],odp[300002]; vector<pair<int,int>>poczatek[300002]; vector<pair<int,pair<int,int>>>koniec[300002]; int main() { scanf("%d%lld%d",&n,&k,&q); for(int i=1;i<=n;++i) { scanf("%lld",&a[i]); pref[i]=pref[i-1]+a[i]; } for(int kar=0;kar<q;++kar) { scanf("%d%d",&l,&r); poczatek[l].push_back(make_pair(r,kar)); koniec[r].push_back(make_pair(0,make_pair(l,kar))); } for(int sal=1;sal<=n;++sal) { if(poczatek[sal].size()>=2) { sort(poczatek[sal].begin(),poczatek[sal].end()); piterek=0; karm=poczatek[sal].size(); ter=sal; depe[sal-1]=0; while(piterek<karm) { depe[ter]=depe[ter-1]; if(ter-k+1>=sal) depe[ter]=max(depe[ter],depe[ter-k]+pref[ter]-pref[ter-k]); while(piterek<karm) { if(ter!=poczatek[sal][piterek].first) break; rozw[poczatek[sal][piterek].second]=1; odp[poczatek[sal][piterek].second]=depe[ter]; ++piterek; } ++ter; } } piterek=0; ter=sal; depe[sal+1]=0; for(int i=koniec[sal].size()-1;i>=0;--i) { if(rozw[koniec[sal][i].second.second]==1) { koniec[sal][i].first=1; } else ++piterek; } --piterek; sort(koniec[sal].begin(),koniec[sal].end()); while(piterek>=0) { depe[ter]=depe[ter+1]; if(ter+k-1<=sal) depe[ter]=max(depe[ter],depe[ter+k]+pref[ter+k-1]-pref[ter-1]); while(piterek>=0) { if(ter!=koniec[sal][piterek].second.first) break; rozw[koniec[sal][piterek].second.second]=1; odp[koniec[sal][piterek].second.second]=depe[ter]; --piterek; } --ter; } } for(int kar=0;kar<q;++kar) { printf("%lld\n",odp[kar]); } return 0; } |