Cod sursa(job #3151149)

Utilizator CelestinNegraru Celestin Celestin Data 19 septembrie 2023 21:10:45
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <iostream>
#include <fstream>
#define nmax 100002
#define inf 10000000001
using namespace std;
struct arbore_intervale{
    long long ssm,smin,smax;
};
arbore_intervale aint[4*nmax];
long long n,m,v[nmax],dp[nmax];
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");
inline long long maxim(long long a,long long b)
{
    if(a>b)
        return a;
    else return b;
}
inline long long minim(long long a,long long b)
{
    if(a<b)
        return a;
    else return b;
}
void build_aint(int nod,int st,int dr)
{
    if(st>dr)
        return;
    if(st==dr)
    {
        aint[nod].ssm=v[st];
        aint[nod].smin=dp[st-1];
        aint[nod].smax=dp[dr];
        return;
    }
    int mid=(st+dr)>>1;
    build_aint(2*nod,st,mid);
    build_aint(2*nod+1,mid+1,dr);
    aint[nod].smax=maxim(aint[2*nod].smax,aint[2*nod+1].smax);
    aint[nod].smin=minim(aint[2*nod].smin,aint[2*nod+1].smin);
    aint[nod].ssm=maxim(maxim(aint[2*nod].ssm,aint[2*nod+1].ssm),aint[2*nod+1].smax-aint[2*nod].smin);
}
void query(int nod,int st,int dr,int a,int b,long long&ssm,long long&prefmin)
{
    if(st>dr)
        return;
    if(st>b||dr<a)
        return;
    if(a<=st&&dr<=b)
    {
        long long curr=aint[nod].ssm;
        if(prefmin!=inf)
        {
            if(aint[nod].smax-prefmin>curr)
                   curr=aint[nod].smax-prefmin;
        }
        if(aint[nod].smin<prefmin)
            prefmin=aint[nod].smin;
        if(curr>ssm)
            ssm=curr;
        return;
    }
    int mid=(st+dr)>>1;
    query(2*nod,st,mid,a,b,ssm,prefmin);
    query(2*nod+1,mid+1,dr,a,b,ssm,prefmin);
}
int main()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        f>>v[i];
        dp[i]=v[i]+dp[i-1];
    }
    build_aint(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        f>>x>>y;
        long long ssm=-inf,prefmin=inf;
        query(1,1,n,x,y,ssm,prefmin);
        g<<ssm<<"\n";
    }
    return 0;
}