Cod sursa(job #2000386)

Utilizator dragos231456Neghina Dragos dragos231456 Data 13 iulie 2017 15:19:45
Problema SequenceQuery Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
string s;
long long arbl[400005],arbr[400005],n,m,vl[100005],vr[100005],x,y,ch;
long long bestsum, inf=(1LL<<62),pre,suf,a,b;

int nextint()
{
    int num=0;
    bool ok=true;
    while(s[ch]==' ') ++ch;
    if(s[ch]=='-')
    {
        ok=false;
        ++ch;
    }
    while(s[ch]>='0' && s[ch]<='9')
    {
        num=num*10+s[ch]-'0';
        ++ch;
    }
    if(!ok) num=-num;
    return num;
}

void build(int nod,int lt,int rt,int pos,int op)
{
    if(lt==rt)
    {
       if(op) arbl[nod]=vl[pos];
       else arbr[nod]=vr[pos];
        return;
    }
    int md=(lt+rt)/2;
    if(pos<=md) build(nod*2,lt,md,pos,op);
    else build(nod*2+1,md+1,rt,pos,op);

    if(op)arbl[nod]=max(arbl[nod*2],arbl[nod*2+1]);
    else arbr[nod]=max(arbr[nod*2],arbr[nod*2+1]);
}

void query(int nod,int lt,int rt,int q,int w,int op)
{
    if(q<=lt && rt<=w)
    {
        if(op) suf=max(suf,arbl[nod]);
        else pre=max(pre,arbr[nod]);
        return;
    }
    if(lt==rt) return;
    int md=(lt+rt)/2;
    if(md>=q) query(nod*2,lt,md,q,w,op);
    if(md<w) query(nod*2+1,md+1,rt,q,w,op);
}

void DI(int x,int y)
{
    if(x==y)
    {
        bestsum=max(bestsum,vr[x]-vr[x+1]);
        return;
    }
    int md=(x+y)/2;
    DI(x,md);
    DI(md+1,y);

    pre=-inf; suf=-inf;
    query(1,1,n,x,md,0);
    query(1,1,n,md+1,y,1);

    bestsum=max(bestsum,pre+suf-vl[n]);
}

int main()
{
    getline(f,s);
    n=nextint(); m=nextint();
    getline(f,s); ch=0;
    for(int i=1;i<=n;++i)
    {
        vl[i]=nextint();
        vr[i]=vl[i];
        vl[i]+=vl[i-1];
        build(1,1,n,i,1);
    }
    for(int i=n;i>=1;--i)
    {
        vr[i]+=vr[i+1];
        build(1,1,n,i,0);
    }
    for(int i=1;i<=m;++i)
    {
        getline(f,s); ch=0;
        a=nextint(); b=nextint();
        bestsum=-inf;
        DI(a,b);
        g<<bestsum<<'\n';
    }
    return 0;
}