Pagini recente » Cod sursa (job #700027) | Cod sursa (job #1565591) | Cod sursa (job #284329) | Cod sursa (job #2680943) | Cod sursa (job #2499313)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
struct fren{
int lt, rt, t;
int ins;
void imfrunza(int x){
ins = t = x;
if(x > 0){
lt = rt = x;
}
}
};
int n, m;
fren tre[410000];
int ele[100041];
int ind;
void brainbig(int p){
fren & me = tre[p];
if(ind > 0){
me.imfrunza(ele[ind--]);
}else{
fren & lt = tre[2*p], rt = tre[2*p+1];
me.lt = max(lt.lt, lt.t+rt.lt);
me.rt = max(rt.rt, rt.t+lt.rt);
me.t = lt.t+rt.t;
}
}
void buildit(){
for(int i = 2*n-1; i >= 1; i--){
brainbig(i);
}
}
int deca(){
int au = 2*n-1;
for(int i = 1; au > i; i <<= 1){
au -= i;
}
return au;
}
fren mer(const fren & lhs, const fren & rhs){
fren r;
r.lt = max(lhs.lt, lhs.t+rhs.lt);
r.rt = max(rhs.rt, rhs.t+lhs.rt);
r.t = rhs.t+lhs.t;
r.ins = lhs.rt+rhs.lt;
return r;
}
fren rec(int a, int b, int lt = 1, int rt = n, int p = 1){
if(lt == a && rt == b){
return tre[p];
}
int m = (lt+rt)/2;
if(a >= lt && a <= m){
if(b <= m){
return rec(a, b, lt, m, 2*p);
}else{
return mer(rec(a, m, lt, m, 2*p), rec(m+1, b, m+1, rt, 2*p+1));
}
}else{
return rec(a, b, m+1, rt, 2*p+1);
}
}
int usta(int a, int b){
fren r = rec(a, b);
int re = max(r.t, r.ins);
if(a != b){
re = max(re, max(r.lt, r.rt));
}
return re;
}
int main(){
fin >> n >> m;
ind = n;
int d = deca();
for(int i = 1; i <= n; i++){
fin >> ele[(i-1+d)%n+1];
}
buildit();
for(int i = 0; i < m; ++i){
int a, b;fin >> a >> b;
fout << usta(a, b) << "\n";
}
return 0;
}