Cod sursa(job #3172452)

Utilizator ioanabaduIoana Badu ioanabadu Data 20 noiembrie 2023 17:35:20
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <iostream>
#include <cmath>
#define N_MAX 15004
#define SQ_N 150
#define M_MAX 100004

using namespace std;

ifstream in ("datorii.in");
ofstream out ("datorii.out");

int n, m, sqn;
int arr[N_MAX], batog[SQ_N];

void build (){
    for (int i=0; i<n; ++i){
        batog[i/sqn] += arr[i];
    }
}

void update (int a, int b){
    batog[a/sqn] -= b;
    arr[a] -= b;
}

void getSumInterval (int left, int right){
    int firstInterval, lastInterval, answer = 0;

    firstInterval = (left + sqn - 1) / sqn * sqn; // primul si ultimul interval care sunt cuprinse in intregime in intervalul cerut
    lastInterval = right / sqn * sqn;

    while (left <= right && left < firstInterval)
        answer  += arr[left++];
    while (right >= left && right >= lastInterval)
        answer += arr[right--];

    firstInterval /= sqn;
    lastInterval /= sqn;

    while (firstInterval < lastInterval)
        answer += batog[firstInterval++];
    out << answer << '\n';
}

int main (){
    in >> n >> m;
    sqn = sqrt(n);
    for (int i=0; i<n; ++i)
        in >> arr[i];

    build();

    int operand, a, b;
    for (int i=1; i<=m; ++i){
        in >> operand >> a >> b;
        if (operand == 0)
            update (a-1, b);
        if (operand == 1)
            getSumInterval (a-1, b-1);
    }
    return 0;
}