Cod sursa(job #2265539)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 21 octombrie 2018 13:46:59
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>

#define MAXN 100000
#define INF 100000000000

using namespace std;

long long ssm[4*MAXN+5], s[4*MAXN+5], sufix[4*MAXN+5], prefix[4*MAXN+5];

long long ssm1, ssm2;
int a, b;

inline long long maxim( long long x, long long y )
{
  if( x<y )
    x=y;

  return x;
}

void update( int p, int st, int dr )
{
  int mid=(st+dr)/2;

  if( st==dr )
    ssm[p]=s[p]=sufix[p]=prefix[p]=b;
  else
  {
    if( a<=mid )
      update(2*p,st,mid);
    else
      update(2*p+1,mid+1,dr);

    ssm[p]=maxim(ssm[2*p],ssm[2*p+1]);
    ssm[p]=maxim(ssm[p],sufix[2*p]+prefix[2*p+1]);
    s[p]=s[2*p]+s[2*p+1];
    sufix[p]=maxim(sufix[2*p+1],s[2*p+1]+sufix[2*p]);
    prefix[p]=maxim(prefix[2*p],s[2*p]+prefix[2*p+1]);
  }
}

void query( int p, int st, int dr )
{
  int mid=(st+dr)/2;

  if( a<=st && dr<=b )
  {
    ssm1=maxim(ssm1,ssm2+prefix[p]);
    ssm1=maxim(ssm1,ssm[p]);
    ssm2=maxim(sufix[p],ssm2+s[p]);
    ssm2=maxim(ssm2,0);
  }
  else
  {
    if( a<=mid )
      query(2*p,st,mid);

    if( mid<b )
      query(2*p+1,mid+1,dr);
  }
}

int main()
{
  freopen( "sequencequery.in", "r", stdin );
  freopen( "sequencequery.out", "w", stdout );

  int n, m, x, y;

  scanf( "%d%d", &n, &m );

  for( int i=1;i<=n;i++ )
  {
    scanf( "%d", &x );

    a=i;
    b=x;

    update(1,1,n);
  }

  for( int i=1;i<=m;i++ )
  {
    scanf( "%d%d", &x, &y );

    a=x;
    b=y;

    ssm1=-INF;
    ssm2=0;

    query(1,1,n);

    printf( "%lld\n", ssm1 );
  }

  return 0;
}