Cod sursa(job #2907796)

Utilizator Bogdy_PPrunescu Bogdan Bogdy_P Data 31 mai 2022 17:23:23
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define N 1000555
using namespace std;

struct nod{int left,right,best,sum;}node[2*N];
int v[N];

long long Max(long long a , long long b)
{
    if(a>b)return a;
    return b;
}


void build(int id,int s,int d)
{
    if( s == d )
    {
        int x = v[s];
        node[id]={x,x,x,x};
        return;
    }
    int m = (s+d)>>1;
    build(id*2 , s , m );
    build(id*2+1,m+1,d);
    node[id].left  = Max( node[id*2].left , node[id*2].sum + node[id*2+1].left );
    node[id].right = Max( node[id*2+1].right , node[id*2+1].sum + node[id*2].right );
    node[id].best  = Max( node[id*2].right + node[id*2+1].left , Max(node[id*2].best , node[id*2+1].best) );
    node[id].sum   = node[id*2].sum + node[id*2+1].sum;

}

int x,y;
long long sum,val;

void query(int id,int s,int d)
{
    if( x <= s && d <= y  )
    {
        if(sum < 0)
            sum = 0;
        val  = Max( val , Max(node[id].best,sum + node[id].left) );
        sum = Max( sum+node[id].sum , node[id].right  );
        return ;
    }

    int m = (s+d)>>1;
    if( x <= m  )
        query(id*2 , s , m );
    if( m < y )
        query(id*2+1,m+1,d);
}


int main()
{
    int n,m;
    freopen("sequencequery.in","r",stdin);
    scanf("%d %d",&n,&m);
    for(int i = 1;i <= n; ++i)
        scanf("%d", &v[i]);
    build(1, 1, n);
    freopen("sequencequery.out","w",stdout);
    for(int i = 1;i <= m; ++i)
    {
        scanf("%d %d",&x,&y);
        val = -(1<<29);
        sum = 0;
        query(1, 1, n);
        printf("%lld\n",val);
    }




    return 0;
}