Cod sursa(job #2139482)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 22 februarie 2018 16:22:31
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <climits>
#include <cstdio>
#define MAXN 100001
using namespace std;
struct arbore
{
    long long left,right,smax,tot;
}aint[4*MAXN];
int v[MAXN],x,y;
long long ans,t;
void dfs(int p,int st,int dr)
{
    if(st==dr)
        aint[p].left=aint[p].right=aint[p].smax=aint[p].tot=v[st];
    else
    {
        int mid=(st+dr)>>1;
        dfs(2*p,st,mid);
        dfs(2*p+1,mid+1,dr);
        long long val=max(aint[2*p].smax,aint[2*p+1].smax);
        aint[p].smax=max(val,aint[2*p].right+aint[2*p+1].left);
        aint[p].left=max(aint[2*p].left,aint[2*p].tot+aint[2*p+1].left);
        aint[p].right=max(aint[2*p+1].right,aint[2*p+1].tot+aint[2*p].right);
        aint[p].tot=aint[2*p].tot+aint[2*p+1].tot;
    }
}
void query(int p,int st,int dr)
{
    if(x<=st && dr<=y)
    {
        ans=max(ans,aint[p].smax);
        ans=max(ans,t+aint[p].left);
        t=max(t+aint[p].tot,aint[p].right);
    }
    else
    {
        int mid=(st+dr)>>1;
        if(x<=mid)
            query(2*p,st,mid);
        if(y>mid)
            query(2*p+1,mid+1,dr);
    }
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("sequencequery.in","r");
    fout=fopen("sequencequery.out","w");
    int n,m;
    fscanf(fin,"%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        fscanf(fin,"%d",&v[i]);
    dfs(1,1,n);
    for(int i=0;i<m;i++)
    {
        fscanf(fin,"%d%d",&x,&y);
        ans=LLONG_MIN,t=0;
        query(1,1,n);
        fprintf(fout,"%lld\n",ans);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}