Cod sursa(job #194794)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 14 iunie 2008 08:46:48
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>
#include<stdlib.h>
#define MAXN 262145
#define INF 10000000005
#define Min(a, b)(a)<(b)?(a):(b)
#define Max(a, b)(a)>(b)?(a):(b)
long long min[MAXN],max[MAXN],sum[MAXN],secv[MAXN],x,a,b,S,minim,poz;
void sequence(int st, int dr, int nod){
    if(st==dr){
        max[nod]=sum[st];
        min[nod]=sum[st-1];
        secv[nod]=x;
    }
    else{
        int m=(st+dr)>>1;
        if(poz<=m)
			sequence(st,m,2*nod);
        else
			sequence(m+1,dr,2*nod+1);
        min[nod]=Min(min[2*nod],min[2*nod+1]);
        max[nod]=Max(max[2*nod],max[2*nod+1]);
        secv[nod]=Max(Max(secv[2*nod],secv[2*nod+1]),max[2*nod+1]-min[2*nod]);
    }
}
void query(int st, int dr, int nod){
    if(a<=st && dr<=b){
        S=Max(S,secv[nod]);
        if(minim!=INF)
            S=Max(S,max[nod]-minim);
        if(minim>min[nod])
			minim=min[nod];
    }
    else{
        int m=(st+dr)>>1;
        if(a<=m)
			query(st, m, 2*nod);
        if(b>m)
			query(m+1, dr, 2*nod+1);
    }
}
int main(){
    freopen("sequencequery.in","r",stdin);
    freopen("sequencequery.out","w",stdout);
    int i, n, m;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%lld",&x);
        poz=i;
        sum[i]=sum[i-1]+x;
        sequence(1, n, 1);
    }
	for(i=0;i<m;i++){
        scanf("%d %d", &a, &b);
        S=-INF;
		minim=INF;
        query(1,n,1);
        printf("%lld\n",S);
    }
	fclose(stdin);
	fclose(stdout);
    return 0;
}