Cod sursa(job #41253)

Utilizator stef2nStefan Istrate stef2n Data 28 martie 2007 08:41:40
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <stdio.h>

#define infile "sequencequery.in"
#define outfile "sequencequery.out"
#define NMAX 100005
struct NOD {int li,ls; long long suma,sumamax,sumabegin,sumaend; NOD *st,*dr;};
FILE *fin,*fout;
NOD *prim;
int n,v[NMAX];

inline long long max(long long x, long long y)
  {
   return (x>y)?x:y;
  }

void creare_arbore(NOD *(&prim), int li, int ls)
  {
   prim=new NOD;
   prim->st=NULL;
   prim->dr=NULL;
   prim->li=li;
   prim->ls=ls;

   if(li==ls)
     prim->suma=prim->sumamax=prim->sumabegin=prim->sumaend=v[li];
   else
    {
     creare_arbore(prim->st,li,(li+ls)/2);
     creare_arbore(prim->dr,(li+ls)/2+1,ls);
     prim->suma=prim->st->suma+prim->dr->suma;
     prim->sumabegin=max(prim->st->sumabegin,prim->st->suma+prim->dr->sumabegin);
     prim->sumaend=max(prim->dr->sumaend,prim->dr->suma+prim->st->sumaend);
     prim->sumamax=max(prim->st->sumamax,prim->dr->sumamax);
     prim->sumamax=max(prim->sumamax,prim->st->sumaend+prim->dr->sumabegin);
    }
  }

int interogare(NOD *(&prim), int li, int ls, int start, int end, long long &suma, long long &sumamax, long long &sumabegin, long long &sumaend)
  {
   if(start<=li && end>=ls)
     {suma=prim->suma;
      sumamax=prim->sumamax;
      sumabegin=prim->sumabegin;
      sumaend=prim->sumaend;
      return 1;}
   else
     {
      int mij=(li+ls)/2;
      long long suma1,sumamax1,sumabegin1,sumaend1,suma2,sumamax2,sumabegin2,sumaend2;
      int answer1=0,answer2=0;
      if(start<=mij)
        answer1=interogare(prim->st,li,mij,start,end,suma1,sumamax1,sumabegin1,sumaend1);
      if(end>mij)
        answer2=interogare(prim->dr,mij+1,ls,start,end,suma2,sumamax2,sumabegin2,sumaend2);
      if(answer1)
        if(answer2)
          {
           suma=suma1+suma2;
           sumabegin=max(sumabegin1,suma1+sumabegin2);
           sumaend=max(sumaend2,suma2+sumaend1);
           sumamax=max(sumamax1,sumamax2);
           sumamax=max(sumamax,sumaend1+sumabegin2);
           return 1;
          }
        else
          {
           suma=suma1;
           sumamax=sumamax1;
           sumabegin=sumabegin1;
           sumaend=sumaend1;
           return 1;
          }
      else
        if(answer2)
          {
           suma=suma2;
           sumamax=sumamax2;
           sumabegin=sumabegin2;
           sumaend=sumaend2;
           return 1;
          }
        else
          return 0;
     }
  }


int main()
{
int i,k,start,end;
long long suma,sumamax,sumabegin,sumaend;
fin=fopen(infile,"r");
fout=fopen(outfile,"w");
fscanf(fin,"%d %d",&n,&k);
for(i=0;i<n;i++)
   fscanf(fin,"%d",&v[i]);
prim=NULL;
creare_arbore(prim,0,n-1);
for(i=0;i<k;i++)
  {
   fscanf(fin,"%d %d",&start,&end);
   interogare(prim,0,n-1,start-1,end-1,suma,sumamax,sumabegin,sumaend);
   fprintf(fout,"%Ld\n",sumamax);
  }
fclose(fin);fclose(fout);
return 0;
}