Cod sursa(job #2833146)

Utilizator ecaterinaEcaterina Stefanescu ecaterina Data 14 ianuarie 2022 20:20:02
Problema Datorii Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <math.h>

int v[15001];
int n;

/// (MAX_n + SQ_N - 1)/SQ_N
int batog[124];

int query(int left, int right) {
    int firstInterval, lastInterval, result, sq;
    
    sq = sqrt(n);
    
    firstInterval = (left+sq-1)/sq*sq;
    lastInterval = right/sq*sq;
    
    result = 0;
    while (left<=right && left<firstInterval) {
        result += v[left];
        left++;
    }
    while (right>=left && right>=lastInterval) {
        result += v[right];
        right--;
    }
    
    firstInterval /= sq;
    lastInterval /= sq;
    
    while (firstInterval < lastInterval) {
        result += batog[firstInterval];
        firstInterval++;
    }
    
    return result;
}

int main() {
    FILE *fin, *fout;
    fin = fopen("datorii.in", "r");
    fout = fopen("datorii.out", "w");
    
    int i, q, op, a, b, sq, pos, value;
    
    fscanf(fin, "%d%d", &n, &q);
    for (i=0; i<n; i++) {
        fscanf(fin, "%d", &v[i]);
    }
    
    sq = sqrt(n);
    for (i=0; i<n; i++) {
        batog[i/sq] += v[i];
    }
    
    while (q>0) {
        fscanf(fin, "%d%d%d", &op, &a, &b);
        a--;
        b--;
        if (op == 0) {
            b++;
            pos = a;
            value = b;
            batog[pos/sq] -= value;
            v[pos] -= value;
        } else if (op == 1) {
            fprintf(fout, "%d\n", query(a, b));
        }
        q--;
    }
    
    fclose(fin);
    fclose(fout);
    return 0;
}