Cod sursa(job #3145760)

Utilizator ecaterinaEcaterina Stefanescu ecaterina Data 16 august 2023 22:36:42
Problema SequenceQuery Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <stdio.h>

#define NMAX 100002
#define INF 2305843009213693952

struct idk {
    long long int prefix;
    long long int sufix;
    long long int ssm;
    long long int sum;
};

int v[NMAX];
idk aint[4*NMAX];

long long int max(long long int a, long long int b) {
    if (a>b) {
        return a;
    }
    return b;
}

void combine (idk &rez, idk &a, idk &b) {
    rez.sum = a.sum+b.sum;
    rez.prefix = max(a.prefix, a.sum+b.prefix);
    rez.sufix = max(b.sufix, a.sufix+b.sum);
    rez.ssm = max(a.ssm, b.ssm);
    rez.ssm = max(rez.ssm, a.sufix+b.prefix);
}

void build(int nod, int st, int dr) {
    int mijl, fiust, fiudr;
    
    if (st == dr) {
        aint[nod].sum = v[st];
        aint[nod].sufix = aint[nod].ssm = aint[nod].prefix = aint[nod].sum;
        return;
    }
    
    mijl = (st+dr)/2;
    fiust = nod+1;
    fiudr = nod + 2*(mijl-st+1);
    
    build(fiust, st, mijl);
    build(fiudr, mijl+1, dr);
    
    combine(aint[nod], aint[fiust], aint[fiudr]);
}

void query(int nod, int st, int dr, int qst, int qdr, idk &rez) {
    int mijl, fiust, fiudr;
    idk rezst, rezdr;
    
    if (qst<=st && qdr>=dr) {
        rez = aint[nod];
    } else {
        mijl = (st+dr)/2;
        fiust = nod+1;
        fiudr = nod + 2*(mijl-st+1);
        
        rezst.prefix = rezst.sufix = rezst.ssm = -INF;
        rezst.sum = 0;
        rezdr.prefix = rezdr.sufix = rezdr.ssm = -INF;
        rezdr.sum = 0;
        if (qst<=mijl) {
            query(fiust, st, mijl, qst, qdr, rezst);
        }
        if (mijl<qdr) {
            query(fiudr, mijl+1, dr, qst, qdr, rezdr);
        }
        combine(rez, rezst, rezdr);
    }
}

int main() {
    FILE *fin, *fout;
    fin = fopen("sequencequery.in", "r");
    fout = fopen("sequencequery.out", "w");
    
    int n, t, tt, i, a, b;
    long long int r;
    idk rez;
    
    fscanf(fin, "%d%d", &n, &t);
    for (i=0; i<n; i++) {
        fscanf(fin, "%d", &v[i]);
    }
    build(0, 0, n-1);
    
    for (tt=0; tt<t; tt++) {
        fscanf(fin, "%d%d", &a, &b);
        a--;
        b--;
        rez.ssm = rez.sum = rez.prefix = rez.sufix = 0;
        query(0, 0, n-1, a, b, rez);
        r = rez.ssm;
        fprintf(fout, "%lld\n", r);
    }
    
    fclose(fin);
    fclose(fout);
    return 0;
}