Cod sursa(job #1964900)

Utilizator alex99Chelba Alexandru alex99 Data 13 aprilie 2017 19:42:26
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define inf 2000000000
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
struct interval
{
    int  stn,drt;
    long long sumstn, sumdrt, summij, sumtot;
};
interval arb[800001];
int n,x,q,a[200001],b[200001];
long long sol,aux;
void update(int po, int st, int dr)
{
    if(st==dr)
    {
        arb[po].stn=st;
        arb[po].drt=dr;
        arb[po].sumstn=a[st];
        arb[po].sumdrt=a[st];
        arb[po].summij=a[st];
        arb[po].sumtot=a[st];
        return ;
    }
    arb[po].stn=st;
    arb[po].drt=dr;
    int mij=(st+dr)/2;
    update(2*po,st,mij);
    update(2*po+1,mij+1,dr);
    arb[po].sumtot=arb[2*po].sumtot+arb[2*po+1].sumtot;
    arb[po].sumstn=max(arb[2*po].sumstn,arb[2*po].sumtot+arb[2*po+1].sumstn);
    arb[po].sumdrt=max(arb[2*po+1].sumdrt,arb[2*po].sumdrt+arb[2*po+1].sumtot);
    arb[po].summij=max(max(arb[2*po].summij,arb[2*po+1].summij),arb[2*po].sumdrt+arb[2*po+1].sumstn);
}
void interogare(int po, int st, int dr, int a, int b)
{
    if(a<=st&&dr<=b)
    {
        sol=max(sol,max(arb[po].summij,aux+arb[po].sumstn));
        aux=max(aux+arb[po].sumstn, arb[po].sumdrt);
        return;
    }
    int mij=(st+dr)/2;
    if(a<=mij) interogare(2*po,st,mij,a,b);
    if(b>mij) interogare(2*po+1,mij+1,dr,a,b);
}
int main()
{
    f>>n>>q;
    for(int i=1;i<=n;i++)
    {
        f>>a[i];
    }
    update(1,1,n);
    int k=1;
    while(arb[k].drt)
    {
        g<<arb[k].stn<<" "<<arb[k].drt<<" "<<arb[k].sumstn<<" "<<arb[k].sumdrt<<" "<<arb[k].summij<<" "<<arb[k].sumtot<<'\n';
        k++;
    }
    for(int i=1;i<=q;i++)
    {
        char c;
        int x,y;
        f>>x>>y;
        ///if(c=='1')
        //{
        sol=aux=-inf;
        ///x++; y++;
        interogare(1,1,n,x,y);
        g<<sol<<'\n';
        //}
        ///x++; update(1,1,n);
    }
    return 0;
}