Cod sursa(job #1767998)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 29 septembrie 2016 23:29:05
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <cstdio>
#include <cctype>
#define MAXBUF 1<<17
FILE*fi,*fout;
char buf[MAXBUF];
int pos=MAXBUF;
inline char nextch(){
    if(pos==MAXBUF){
        fread(buf,1,MAXBUF,fi);
        pos=0;
    }
    return buf[pos++];
}
inline int getnr(){
   char a=nextch();
   char sign=1;
   if(a=='-')
      sign=-1;
   while(isdigit(a)==0)
      a=nextch();
   int nr=0;
   while(isdigit(a)==1){
      nr=nr*10+a-'0';
      a=nextch();
   }
   return nr*sign;
}
#define MAXN 100000
#define INF 100000000000000000LL
struct Nod{
    long long ssm;
    long long prefix;
    long long sufix;
    long long sum;
    inline void reset(long long val){
        ssm=val;
        prefix=val;
        sufix=val;
        sum=val;
    }
};
Nod aint[4*MAXN+1];
inline long long getmax(long long a,long long b){
    if(a>b) return a;
    return b;
}
void update(int nod,int left,int right,int poz,int val){
     if(left==right)
        aint[nod].reset(val);
     else{
        int med=(left+right)/2;
        if(poz<=med)
          update(2*nod,left,med,poz,val);
        else
          update(2*nod+1,med+1,right,poz,val);
        aint[nod].ssm=getmax(getmax(aint[2*nod].ssm,aint[2*nod+1].ssm),aint[2*nod].sufix+aint[2*nod+1].prefix);
        aint[nod].prefix=getmax(aint[2*nod].prefix,aint[2*nod].sum+aint[2*nod+1].prefix);
        aint[nod].sufix=getmax(aint[2*nod+1].sum+aint[2*nod].sufix,aint[2*nod+1].sufix);
        aint[nod].sum=aint[2*nod].sum+aint[2*nod+1].sum;
     }
}
long long ans;
long long ssm;
void query(int nod,int left,int right,int l,int r){
     if(l<=left&&right<=r){
         ans=getmax(ans,getmax(aint[nod].ssm,getmax(aint[nod].prefix+ssm,aint[nod].sum+ssm)));
         ssm=getmax(aint[nod].sufix,ssm+aint[nod].sum);
     }
     else{
         int med=(left+right)/2;
         if(l<=med)
           query(2*nod,left,med,l,r);
         if(med<r)
           query(2*nod+1,med+1,right,l,r);
     }
}
int main(){
   int n,m,x,a,b,i;
   fi=fopen("sequencequery.in" ,"r");
   fout=fopen("sequencequery.out" ,"w");
   n=getnr();
   m=getnr();
   for(i=1;i<=4*n;i++)
     aint[i].reset(-INF);
   for(i=1;i<=n;i++){
     x=getnr();
     update(1,1,n,i,x);
   }
   while(m>0){
      m--;
      a=getnr();
      b=getnr();
      ans=-INF;
      ssm=-INF;
      query(1,1,n,a,b);
      fprintf(fout,"%lld\n" ,ans);
   }
   fclose(fi);
   fclose(fout);
   return 0;
}