Cod sursa(job #785906)

Utilizator stefanzzzStefan Popa stefanzzz Data 10 septembrie 2012 09:56:04
Problema SequenceQuery Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#define MAXN 100005
#define INF 500000
using namespace std;
ifstream f("sequencequery.in");
ofstream g("sequencequery.out");

struct nod_ai{
    long long a,b,c,d;};

int m,n,poz,el,mij,p,q,v[MAXN];
long long mx,S,mx2;
nod_ai ai[4*MAXN];
bool tip;

void query(int nod,int st,int dr);
void construieste_ai(int nod,int st,int dr);
long long MAX(long long x,long long y){
    return x>y?x:y;}

int main()
{
    int i;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>v[i];
    construieste_ai(1,1,n);
    for(i=1;i<=m;i++){
        f>>p>>q;
        mx=-INF;
        S=0;
        query(1,1,n);
        g<<mx<<'\n';}
    f.close();
    g.close();
    return 0;
}

void query(int nod,int st,int dr){
    if(st>=p&&dr<=q){
        mx2=MAX(ai[nod].c,ai[nod].a+S);
        mx=MAX(mx,mx2);
        S=MAX(S+ai[nod].d,ai[nod].b);}
    else{
        mij=(st+dr)/2;
        if(mij>=p)
            query(2*nod,st,mij);
        mij=(st+dr)/2;
        if(q>mij)
            query(2*nod+1,mij+1,dr);}}

void construieste_ai(int nod,int st,int dr){
    if(st==dr){
        ai[nod].d=v[st];
        ai[nod].a=ai[nod].b=ai[nod].c=v[st];}
    else{
        construieste_ai(2*nod,st,(st+dr)/2);
        construieste_ai(2*nod+1,(st+dr)/2+1,dr);
        ai[nod].d=ai[2*nod].d+ai[2*nod+1].d;
        ai[nod].a=MAX(ai[2*nod].d+ai[2*nod+1].a,ai[2*nod].a);
        ai[nod].b=MAX(ai[2*nod+1].b,ai[2*nod].b+ai[2*nod+1].d);
        mx=MAX(ai[2*nod].c,ai[2*nod+1].c);
        ai[nod].c=MAX(mx,ai[2*nod].b+ai[2*nod+1].a);}}