Cod sursa(job #921417)

Utilizator superman_01Avramescu Cristian superman_01 Data 20 martie 2013 23:15:40
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include<cstdio>
#include<utility>

#define MAX_SIZE 1<<20
#define max(a,b) ((a)>(b)?(a):(b))
#define lf (2*node)
#define rf (2*node+1)

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

using namespace std;

template <class T>

	class aint
{
public:
    int ff,ss,th,ft;
};

int n,v[MAX_SIZE],pos,st,dr;
long long val;
long long Answer,S;
aint < long long > arb[MAX_SIZE<<1+1];

void Build( int node, int left, int right )
{
    if(left == right )
    {
        arb[node].ff=arb[node].ss=arb[node].th=v[left];
        arb[node].ft=v[left];
    }
    else

    {
        int mid =(left+right)>>1;
        Build(lf,left,mid);
        Build(rf,mid+1,right);

        arb[node].ff=max(arb[lf].ff,arb[rf].ff+arb[lf].ft);
        arb[node].ss=max(arb[rf].ss,arb[lf].ss+arb[rf].ft);
        arb[node].th=max(arb[lf].ss+arb[rf].ff,max(arb[lf].th,arb[rf].th));
  
		arb[node].ft=arb[lf].ft+arb[rf].ft;


    }


}/*
void Update(int node,int left,int right)
{
  if( left == right )
  {
      arb[node].ft=val;
      arb[node].ff=arb[node].ss=arb[node].th=val;
  }
  else
  {
      int mid=(left+right)>>1;
      if(pos <= mid)
        Update(lf,left,mid);
      else
        Update(rf,mid+1,right);

        arb[node].ff=max(arb[lf].ff,arb[rf].ff+arb[lf].ft);
        arb[node].ss=max(arb[rf].ss,arb[lf].ss+arb[rf].ft);
        arb[node].th=max(arb[lf].ss+arb[rf].ff,max(arb[lf].th,arb[rf].th));
  
		arb[node].ft=arb[lf].ft+arb[rf].ft;

 }
}
*/
void Query (int node, int left ,int right )
{
    if( st <= left && right  <= dr )
    {
		
		Answer=max(Answer,max(arb[node].th,S+arb[node].ff));
          S=max(S+arb[node].ft,arb[node].ss);


    }
    else
    {
        int mid=(left+right)>>1;
        if(st<= mid)
            Query(lf,left,mid);
        if(dr>mid)
            Query(rf,mid+1,right);


    }





}


int main( void )
{
	int m;
    fscanf(f,"%d%d",&n,&m);
    for(int i(1);  i <= n; ++i )
    {
        fscanf(f,"%d",&v[i]);
		
	}
    Build(1,1,n);
    for(int i(1); i <= m ; ++i )
    {
        int x,y;
        fscanf(f,"%d%d",&x,&y);
      
            S=0;
			Answer=-1<<30;
            st=x;
            dr=y;
            Query(1,1,n);
			fprintf(g,"%lld\n",Answer);
		 


    }

   fclose(f);
   fclose(g);
   return 0;


}