Cod sursa(job #2499320)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 25 noiembrie 2019 20:42:24
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#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 = 1;

void brainbig(int p){
	fren & me = tre[p];
	if(ind <= n){
		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;
	
	int d = deca();
	for(int i = n; i >= 1; 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;
}