Cod sursa(job #2638927)

Utilizator BereaBerendea Andrei Berea Data 30 iulie 2020 16:09:39
Problema SequenceQuery Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
// #include <iostream>
#include <fstream>

using namespace std;
int n,m,x,y;
int ma,s;

ifstream cin("sequencequery.in");
ofstream cout("sequencequery.out");
const int MAXN = 4e5 + 5;
int aints[MAXN];
int aintSM[MAXN];
int aintL[MAXN] ;
int aintR[MAXN];


void update(int nod, int l , int r, int poz, int val) {
	if(l == r) {
	aintL[nod] = aintR[nod] = aints[nod] = aintSM[nod] = val;
	return;
}
int mj = (l + r) >> 1;
if(mj >= poz)
	update(nod*2,l,mj,poz,val);
else
	update(nod*2+1,mj+1,r,poz,val);
aints[nod] =  aints[nod*2] + aints[nod*2+1];
aintSM[nod] = max(aintSM[nod*2],max(aintSM[nod*2+1],aintR[nod*2] + aintL[nod*2+1]));
aintL[nod]= max(aintL[nod*2],aints[nod*2] + aintL[nod*2+1]);
aintR[nod]= max(aintR[nod*2+1],aintR[nod*2+1] + aintR[nod*2]);

}

void query(int nod, int l, int r, int x, int y){
	if(l >= x and r <= y){
		ma = max(ma,aintSM[nod]);
		ma = max(ma,s + aintL[nod]);
		s = max(s+aints[nod],aintR[nod]);
	return;
}
	int mj = (l + r) >> 1;
	if(x <= mj)
	query(nod*2,l,mj,x,y);
	if(y > mj)
	query(nod*2+1,mj+1,r,x,y);
}

int main() {

	cin >> n >> m;
	for ( int i = 1; i <= n; ++i) {
		cin >>x;
		update(1,1,n,i,x);
}
	for ( int i = 1; i <= m; ++i) {
        cin >> x >> y;
		ma = - (1<<30);
		s = 0;
		query(1,1,n,x,y);
		cout << ma <<"\n";
}
}