Cod sursa(job #2005559)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 27 iulie 2017 14:34:05
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<iostream>
#include<fstream>
#define DN 132200
#define INF 20000000000
using namespace std;
fstream fin("sequencequery.in",ios::in),fout("sequencequery.out",ios::out);
class e
{
public:
    e(){}
    e(int val){
        st=dr=mij=all=val;
    }
    long long st,dr,mij,all;
};
e arb[2*DN];
long long n,m,p1,p2,p,poz,st,dr,rst,ras,val;
void query(int nod,int l,int r)
{
    int m=(l+r)/2,f1=nod*2,f2=nod*2+1;
    if(st<=l && r<=dr)
    {
        ras=max(max(ras,arb[nod].mij),rst+arb[nod].st);
        rst=max(rst+arb[nod].all,arb[nod].dr);
        return ;
    }
    if(st<=m) query(f1,l,m);
    if(m<dr)  query(f2,m+1,r);
}
void update(int nod,int l,int r)
{
    int i,m=(l+r)/2,f1=nod*2,f2=nod*2+1;
    if(l==r)
    {
        arb[nod]=e(val);
        return ;
    }
    if(poz<=m) update(f1,l,m);
    if(m<poz)  update(f2,m+1,r);

    arb[nod].st=max(arb[f1].st,arb[f1].all+arb[f2].st);
    arb[nod].dr=max(arb[f2].dr,arb[f1].dr+arb[f2].all);
    arb[nod].mij=max(max(arb[f1].mij,arb[f2].mij),arb[f1].dr+arb[f2].st);
    arb[nod].all=arb[f1].all+arb[f2].all;
}
void build()
{
    int i,f1,f2;
    for(i=p1-1;i>0;i--)
    {
        arb[i].st=max(arb[f1].st,arb[f1].all+arb[f2].st);
        arb[i].dr=max(arb[f2].dr,arb[f1].dr+arb[f2].all);
        arb[i].mij=max(max(arb[f1].mij,arb[f2].mij),arb[f1].dr+arb[f2].st);
        arb[i].all=arb[f1].all+arb[f2].all;
    }
}
int main()
{
    int i,a,b,c;
    fin>>n>>m;
    for(p=1;p<n;p=p*2);
    p1=p;p2=p1+n-1;p=p*2;
    for(i=1;i<=n;i++)
    {
        fin>>val;poz=i;
        update(1,1,n);
    }
    //build();

    for(i=1;i<=m;i++)
    {
        fin>>st>>dr;
        rst=ras=-INF;
        query(1,1,n);
        fout<<ras<<"\n";
    }
}