Cod sursa(job #246331)

Utilizator katakunaCazacu Alexandru katakuna Data 20 ianuarie 2009 17:39:50
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<stdio.h>
#include<algorithm>
#define NMAX 100111
#define INF 1<<30
using namespace std;

struct sec {long long tot,x,y,max;} sol,a[4*NMAX];
long long m,i,n,n1,n2,x,y;


void update(long long nod,long long p,long long u,long long poz,long long val){
long long mij=(p+u)>>1;

  if(p == u){
  a[nod].tot=a[nod].x=a[nod].y=a[nod].max = val;
  return ;
  }

  if(poz <= mij) update(nod<<1,p,mij,poz,val);
  else           update((nod<<1)+1,mij+1,u,poz,val);

n1=nod<<1;
n2=(nod<<1)+1;

  a[nod].tot=a[n1].tot+a[n2].tot;
  a[nod].max=max(a[n1].max, a[n2].max);
  a[nod].max=max(a[nod].max, a[n1].y + a[n2].x);
  a[nod].y=max(a[n2].y, a[n2].tot + a[n1].y);
  a[nod].x=max(a[n1].x, a[n1].tot + a[n2].x);

}

void query(long long nod,long long p,long long u,long long A,long long B){
long long mij=(p+u)>>1;

   if(A<=p && u<=B){
    if(sol.tot == -INF) sol.tot=a[nod].tot;
    else sol.tot+= a[nod].tot;
   sol.max = max(sol.max,a[nod].max);
   sol.max = max(sol.max,sol.y+a[nod].x);
   sol.y = max(a[nod].y, a[nod].tot + sol.y);
   return ;
   }

   if(A<=mij) query(nod<<1,p,mij,A,B);
   if(B>mij)  query((nod<<1)+1,mij+1,u,A,B);

}


int main(){

FILE *f=fopen("sequencequery.in","r");
FILE *g=fopen("sequencequery.out","w");
fscanf(f,"%lld %lld",&n,&m);

  for(i=1;i<=4*n;i++)
  a[i].x=a[i].y=a[i].max=a[i].tot=-INF;

  for(i=1;i<=n;i++){
  fscanf(f,"%lld",&x);
  update(1,1,n,i,x);
  }

  for(i=1;i<=m;i++){
  fscanf(f,"%lld %lld",&x,&y);
  sol.max=sol.x=sol.tot=sol.y=-INF;
  query(1,1,n,x,y);
  fprintf(g,"%lld\n",sol.max);
  }

fclose(f);
fclose(g);

return 0;
}