Cod sursa(job #2591695)

Utilizator ivan.tudorIvan Tudor ivan.tudor Data 30 martie 2020 23:31:22
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include<bits/stdc++.h>
using namespace std;
struct ajutornod{
  long long st,dr,mij;
  long long sum;
};
const int N=200005;
ajutornod aint[4*N];
int v[N];
void mrge(int nod){
  ajutornod fiust=aint[2*nod];
  ajutornod fiudr=aint[2*nod+1];
  ajutornod &x=aint[nod];

  x.st=max(fiust.st,fiust.sum+fiudr.st);
  x.dr=max(fiudr.dr,fiudr.sum+fiust.dr);
  x.sum=fiust.sum+fiudr.sum;
  x.mij=max(max(fiust.mij,fiudr.mij),fiust.dr+fiudr.st);
}
const long long INF=1LL<<40;
void build(int nod,int st,int dr){
  if(st>dr)
    return;
  if(st==dr){
    aint[nod]={v[st],v[st],v[st],v[st]};
    return;
  }
  int mid=(st+dr)/2;
  build(2*nod,st,mid);
  build(2*nod+1,mid+1,dr);
  mrge(nod);
}

void update(int nod,int st,int dr,int upoz,int val){
  if(st>dr || upoz<st || upoz>dr){
    return;
  }
  if(st==dr){
    aint[nod]={val,val,val,val};
    return;
  }
  int mid=(st+dr)/2;
  update(2*nod,st,mid,upoz,val);
  update(2*nod+1,mid+1,dr,upoz,val);
  mrge(nod);
}
void query(int nod,int st,int dr,int qst,int qdr,ajutornod &rasp){
  if(st>dr || qdr<st || qst>dr){
    return;
  }
  if(qst<=st && dr<=qdr){
    rasp.mij=max(max(rasp.mij,aint[nod].mij),rasp.dr+aint[nod].st);
    rasp.dr=max(aint[nod].dr,aint[nod].sum+rasp.dr);
    return;
  }
  int mid=(st+dr)/2;
  query(2*nod,st,mid,qst,qdr,rasp);
  query(2*nod+1,mid+1,dr,qst,qdr,rasp);
}
int main()
{
  FILE*fin,*fout;
  fin=fopen("sequencequery.in","r");
  fout=fopen("sequencequery.out","w");
  int n,q;
  fscanf(fin,"%d%d",&n,&q);
  for(int i=1;i<=n;i++){
    fscanf(fin,"%d",&v[i]);
  }
  build(1,1,n);
  for(int i=1;i<=q;i++){
    int a,b;
    fscanf(fin,"%d%d",&a,&b);
    ajutornod rasp={-INF,-INF,-INF,-INF};
    query(1,1,n,a,b,rasp);
    fprintf(fout,"%lld\n",rasp.mij);
  }
  return 0;
}