Cod sursa(job #1950049)

Utilizator Garen456Paun Tudor Garen456 Data 2 aprilie 2017 17:35:18
Problema SequenceQuery Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <fstream>

using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int n,m;
struct swg
{ long long sum,s,d;
    long long maxi;
};
swg a[500005];

long long maxdr(int nd,int x,int y,int st,int dr)
{
    if(x==st&& y==dr)
        return a[nd].d;
    else
    { long long maxi; int mijl=(st+dr)/2;
      if(x>mijl)
        return maxdr(2*nd+1,x,y,mijl+1,dr);
      else
      { maxi=maxdr(2*nd+1,mijl+1,y,mijl+1,dr);
          maxi=max(maxi,a[2*nd+1].sum + maxdr(2*nd,x,mijl,st,mijl));
          return maxi;
      }
    }

}


long long maxst(int nd,int x,int y,int st,int dr)
{
    if(x==st && y==dr)
        return a[nd].d;
    else
    {
        long long maxi; int mijl=(st+dr)/2;
       if(y<=mijl) return maxst(2*nd,x,y,st,mijl);
       else
       { maxi=maxst(2*nd,x,mijl,st,mijl);
           maxi=max(maxi , a[2*nd].sum +maxst(2*nd+1,mijl+1,y,mijl+1,dr) );
           return maxi;
       }
    }


}

long long query(int nd,int x,int y,int st,int dr)
{
    if(x==st && y==dr)
        return a[nd].maxi;
    int mijl;
    mijl=(st+dr)/2;
    if(y<=mijl)
        return query(2*nd,x,y,st,mijl);
    if(x>mijl) return query(2*nd+1,x,y,mijl+1,dr);

    long long maxi;
        maxi=max(query(2*nd,x,mijl,st,mijl),query(2*nd+1,mijl+1,y,mijl+1,dr) );
        maxi=max(maxi,maxdr(2*nd,x,mijl,st,mijl)+maxst(2*nd+1,mijl+1,y,mijl+1,dr) );
 return maxi;
}
int main()
{    fin>>n>>m;
    int narb=1,i,x,y;
    while(narb<n) narb*=2;
    for(i=1;i<=n;++i)
        {fin>>a[i+narb-1].sum;  a[i+narb-1].maxi=a[i+narb-1].s=a[i+narb-1].d=a[i+narb-1].sum;}
    for(i=narb-1;i>=1;--i)
    { a[i].sum=a[i*2].sum+a[i*2+1].sum;
        if(a[i*2+1].d==a[i*2+1].sum)
            a[i].d=max(a[i*2+1].d,a[i*2+1].d+a[i*2].d);
        else a[i].d=a[i*2+1].d;

        if(a[i*2+1].sum+a[i*2].d>a[i].d)
            a[i].d=a[i*2+1].sum+a[i*2].d;

        if(a[i*2].s==a[i*2].sum) a[i].s=max(a[i*2].s,a[i*2].s+a[i*2+1].s);
        else a[i].s=a[i*2].s;

        if(a[i*2].sum+a[i*2+1].s>a[i].s)
            a[i].s=a[i*2].sum+a[i*2+1].s;

        a[i].maxi=max(a[i*2].maxi,a[i*2+1].maxi);
        a[i].maxi=max(a[i].maxi,a[i].d); a[i].maxi=max(a[i].maxi,a[i].d);
        a[i].maxi=max(a[i].maxi,a[i*2].d+a[i*2+1].s);
    }
    for(i=1;i<=m;++i)
    { fin>>x>>y;
        fout<<query(1,x,y,1,n)<<"\n";
    }
    //fout<<maxst(3,5,7,5,8);
    return 0;
}