Cod sursa(job #2347479)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 18 februarie 2019 20:24:48
Problema SequenceQuery Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <iostream>
#define INF 999999999
using namespace std;
FILE *in,*out;

int n,m,lf,rg,sol,s;
int v[100002];

struct name {
    int tot,l,r,ans;
} ai[400002];

void read() {
    fscanf(in,"%d %d",&n,&m);
    for(int i=1; i<=n; i++)
        fscanf(in,"%d",&v[i]);
}

void update(int node, int left, int right) {
    if(left==right) {
        ai[node].l=ai[node].r=ai[node].ans=ai[node].tot=v[left];
        return;
    }
    int mij=(left+right)/2;
    update(node*2,left,mij);
    update(node*2+1,mij+1,right);

    ai[node].l=max(ai[node*2].l,ai[node*2].tot+ai[node*2+1].l);
    ai[node].r=max(ai[node*2+1].r,ai[node*2+1].tot+ai[node*2].r);
    ai[node].tot=ai[node*2].tot+ai[node*2+1].tot;
    ai[node].ans=max(ai[node*2].ans,max(ai[node*2+1].ans,ai[node*2+1].l+ai[node*2].r));
}

void querry(int node, int left, int right) {
    if(lf<=left && rg>=right) {
        if(s<0)
            s=0;
        sol=max(sol,max(s+ai[node].l,ai[node].ans));
        s=max(s+ai[node].tot, ai[node].r);
        return;
    }
    int mij=(left+right)/2;
    if(lf<=mij)
        querry(2*node, left, mij);
    if(rg>mij)
        querry(2*node+1, mij+1, right);

}

void solve() {
    update(1,1,n);
    for(int i=1; i<=m; i++) {
        fscanf(in,"%d %d",&lf,&rg);
        s=sol=-INF;
        querry(1,1,n);
        fprintf(out,"%d\n",sol);
    }
}

int main() {
    in=fopen("sequencequery.in","r");
    out=fopen("sequencequery.out","w");
    read();
    solve();
    return 0;
}