Cod sursa(job #760896)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 23 iunie 2012 14:09:06
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<stdio.h>
#define dim 100010

FILE*f=fopen("sequencequery.in","r");
FILE*g=fopen("sequencequery.out","w");

int V[dim],S[dim],n,m,a,b;

struct arbore{
	int b;
	int i;
	int e;
}A[3*dim];

struct intervale{
	int b;
	int i;
	int e;
	int t;
}aux;

inline void read(){
	int i;
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++)
		fscanf(f,"%d",&V[i]),S[i]=S[i-1]+V[i];
}

inline int maxim(int x , int y , int z){
	int t=(x>y)?x:y;
	t=(t>z)?t:z;
	return t;
}

inline int maxim2(int x,int y){
	return (x>y)?x:y;
}

void update(int nod,int st,int dr){
	if(st==dr){
		A[nod].b=A[nod].i=A[nod].e=V[st];
		return;
	}
	int mij=(st+dr)/2;
	update(2*nod,st,mij);
	update(2*nod+1,mij+1,dr);
	A[nod].i=maxim(A[2*nod].i,A[2*nod+1].i,A[2*nod].e+A[2*nod+1].b);
	A[nod].b=maxim2(A[2*nod].b,S[mij]-S[st-1]+A[2*nod+1].b);
	A[nod].e=maxim2(A[2*nod+1].e,S[dr]-S[mij]+A[2*nod].e);
}

intervale querry(int nod,int st,int dr){
	intervale v1,v2,v3;
	int ok2=0,ok3=0;
	if(a<=st&&dr<=b){
		v1.b=A[nod].b;
		v1.i=A[nod].i;
		v1.e=A[nod].e;
		v1.t=S[dr]-S[st-1];
		return v1;
	}
	int mij=(st+dr)/2;
	if((a>=st&&a<=mij)||(b>=st&&b<=mij))
		v2=querry(2*nod,st,mij),ok2=1;;
	if((a>=(mij+1)&&a<=dr)||(b>=(mij+1)&&b<=dr))
		v3=querry(2*nod+1,mij+1,dr),ok3=1;
	if(ok2&&(!ok3))
		return v2;
	if(ok3&&(!ok2))
		return v3;
	v1.i=maxim(v2.i,v3.i,v2.e+v3.b);
	v1.b=maxim2(v2.b,v2.t+v3.b);
	v1.e=maxim2(v3.e,v3.t+v2.e);
	v1.t=v2.t+v3.t;
	return v1;
}

int main(){
	
	read();
	
	update(1,1,n);
	
	for(int i=1;i<=m;i++){
		fscanf(f,"%d%d",&a,&b);
		aux=querry(1,1,n);
		fprintf(g,"%d\n",aux.i);
	}
	
	return 0;
}