Cod sursa(job #3290805)

Utilizator bagae123Burlacu Andrei bagae123 Data 31 martie 2025 22:33:32
Problema SequenceQuery Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
#include<algorithm>
#include<climits>
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
const int Nmax=1e5;
struct Node
{
    int sum,bestPrefix,bestSuffix,bestSubarray;
};
Node Arb[4*Nmax+5];
int v[Nmax+5];
Node unify(Node left,Node right)
{
    Node res;
    res.sum=left.sum+right.sum;
    res.bestPrefix=max(left.bestPrefix,left.sum+right.bestPrefix);
    res.bestSuffix=max(right.bestSuffix,right.sum+left.bestSuffix);
    res.bestSubarray=max({left.bestSubarray,right.bestSubarray,left.bestSuffix+right.bestPrefix});
    return res;
}
void build(int nod,int left,int right)
{
    if(left==right)
    {
        Arb[nod]= {v[left],v[left],v[left],v[left]};
        return;
    }
    int mid=(left+right)/2;
    build(2*nod,left,mid);
    build(2*nod+1,mid+1,right);
    Arb[nod]=unify(Arb[2*nod],Arb[2*nod+1]);
}
void query(int left,int right,int qleft,int qright,int nod,Node &res)
{
    if(left>qright||right<qleft)
    {
        res= {-INT_MAX,-INT_MAX,-INT_MAX,-INT_MAX};
        return;
    }
    if(qleft<=left&&right<=qright)
    {
        res=Arb[nod];
        return;
    }
    int mid=(left+right)/2;
    Node leftRes,rightRes;
    query(left,mid,qleft,qright,2*nod,leftRes);
    query(mid+1,right,qleft,qright,2*nod+1,rightRes);
    if(leftRes.sum==-INT_MAX)res=rightRes;
    else if(rightRes.sum==-INT_MAX)res=leftRes;
    else res=unify(leftRes,rightRes);
}
int main()
{
    int n,q;
    fin>>n>>q;
    for(int i=1; i<=n; i++)
    {
        fin>>v[i];
    }
    build(1,1,n);
    while(q--)
    {
        int a,b;
        fin>>a>>b;
        Node res;
        query(1,n,a,b,1,res);
        fout<<res.bestSubarray<<"\n";
    }
    return 0;
}