Cod sursa(job #1932515)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 19 martie 2017 20:53:11
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <fstream>
#include <stdint.h>
#define nmax 100001
using namespace std;
fstream f1("sequencequery.in", ios::in);
fstream f2("sequencequery.out", ios::out);
int32_t n, m, v[nmax];
struct arb_int
{
    int32_t total, l, r, sum;
}a[4*nmax], aux[4*nmax];
const int32_t inf=1000000000;
///n= nr valori
///v= vect de valori
///m= nr intrebari
///a[poz].total= suma maxima a unei subsecvente de pe intervalul coresp lui poz;
///a[poz].l=suma maxima a unei subsecvente care incepe cu primul element de pe intervalul coresp lui poz;
///a[poz].r=suma maxima a unei subsecvente care se termina cu ultimul element de pe intervalul coresp lui poz;
///a[poz].sum=suma tuturor valorilor de pe intervalul coresp lui poz;
void citire()
{
    int32_t i;
    f1>>n>>m;
    for(i=1; i<=n; i++)
        f1>>v[i];
}
void init (int32_t poz)
{
    a[poz].total=0;
    a[poz].l=0;
    a[poz].r=0;
    a[poz].sum=0;
}
int32_t maxim(int32_t a, int32_t b)
{
    if(a>b) return a;
    else return b;
}
void creare(int32_t poz, int32_t st ,int32_t dr)
{
    if(st<dr)
    {
      int32_t mijl=(st+dr)/2;
      init(2*poz);
      init(2*poz+1);
      creare(poz*2, st, mijl);
      creare(poz*2+1, mijl+1, dr);

      a[poz].total= maxim(a[poz*2].total, maxim( a[poz*2+1].total, a[poz*2].r+a[poz*2+1].l));
      a[poz].l=maxim(a[poz*2].l, a[poz*2].sum+a[poz*2+1].l);
      a[poz].r=maxim(a[poz*2+1].r, a[poz*2+1].sum+ a[poz*2].r);
      a[poz].sum= a[poz*2].sum+a[poz*2+1].sum;
    }
    else if(st==dr)
    {
        a[poz].total=v[st];
        a[poz].l=v[st];
        a[poz].r=v[st];
        a[poz].sum=v[st];
    }
}
void init_inf(int32_t poz)
{
    aux[poz].total=-inf;
    aux[poz].l=-inf;
    aux[poz].r=-inf;
    aux[poz].sum=-inf;
}
int32_t sum_sub_max(int32_t poz, int32_t st, int32_t dr, int32_t x, int32_t y)
{
    if((x<=st)&&(dr<=y))
    {
        aux[poz]=a[poz];
       ///interval inclus in cel cautat
    }
    else if((y<st)||(dr<x))
    {
       init_inf(poz);
        ///nu se intersecteaza
    }
    else
    {
        int32_t mijl=(st+dr)/2, max1=-inf, max2=-inf;

        if(x<=mijl) max1=sum_sub_max(2*poz, st, mijl, x, y);
        else init_inf(2*poz);
        if(mijl<y)  max2=sum_sub_max(2*poz+1, mijl+1, dr, x, y);
        else init_inf(2*poz+1);

        aux[poz].total=maxim(max1 , maxim(max2 , aux[2*poz].r+aux[2*poz+1].l));
        aux[poz].l=maxim(aux[poz*2].l , aux[poz*2].sum+ aux[poz*2+1].r);
        aux[poz].r=maxim(aux[poz*2+1].r , aux[poz*2+1].sum+ aux[poz*2].r);
        aux[poz].sum=aux[poz*2].sum+aux[poz*2+1].sum;
    }
     return aux[poz].total;
}
void intrebari()
{
    int32_t i, x, y;
    for(i=1; i<=m; i++)
    {
        f1>>x>>y;
        f2<<sum_sub_max(1, 1, n, x, y)<<"\n";
    }
}
int main()
{
    citire();
    creare(1, 1, n);
    intrebari();
    return 0;
}