Cod sursa(job #3145758)

Utilizator ecaterinaEcaterina Stefanescu ecaterina Data 16 august 2023 22:31:46
Problema SequenceQuery Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <stdio.h>

#define NMAX 100002

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

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

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

void combine (idk &rez, idk &a, idk &b) {
    
    
}

void build(int nod, int st, int dr) {
    int mijl, fiust, fiudr;
    
    if (st == dr) {
        aint[nod].prefix = aint[nod].sufix = aint[nod].ssm = aint[nod].sum = v[st];
        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]);
}

int query(int nod, int st, int dr, int qst, int qdr) {
    int mijl, fiust, fiudr, rez;

    if (qst<=st && qdr>=dr) {
        return aint[nod];
    }
    
    mijl = (st+dr)/2;
    fiust = nod+1;
    fiudr = nod + 2*(mijl-st+1);
    
    rez = 0;
    if (qst<=mijl) {
        rez+=query(fiust, st, mijl, qst, qdr);
    }
    if (mijl<qdr) {
        rez+=query(fiudr, mijl+1, dr, qst, qdr);
    }
    
    return rez;
}

void update(int nod, int st, int dr, int poz, int val) {
    int mijl, fiust, fiudr;
    
    if (st == dr) {
        aint[nod] -= val;
        return;
    }
    
    mijl = (st+dr)/2;
    fiust = nod+1;
    fiudr = nod + 2*(mijl-st+1);
    
    if (poz <= mijl) {
        update(fiust, st, mijl, poz, val);
    } else {
        update(fiudr, mijl+1, dr, poz, val);
    }
    
    aint[nod] = aint[fiust]+aint[fiudr];
}

int main() {
    FILE *fin, *fout;
    fin = fopen("sequencequery.in", "r");
    fout = fopen("sequencequery.out", "w");
    
    int n, t, tt, i, a, b, 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 = query(0, 0, n-1, a, b);
        fprintf(fout, "%d\n", rez);
    }
    
    fclose(fin);
    fclose(fout);
    return 0;
}