Cod sursa(job #2902991)

Utilizator 4N70N1U5Antonio Nitoi 4N70N1U5 Data 17 mai 2022 00:27:39
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>

using namespace std;

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

int N, M, S[15001], A[60004];

void preprocess(int pos, int left, int right)
{
    if (left == right)
    {
        A[pos] = S[left];
        return;
    }
 
    int middle = (left + right) / 2;
 
    preprocess(pos * 2, left, middle);
    preprocess(pos * 2 + 1, middle + 1, right);
 
    A[pos] = A[pos * 2] + A[pos * 2 + 1];
}
 
void update(int pos, int left, int right, int a)
{
    if (a < left || right < a)
        return;
 
    if (left == right)
    {
        A[pos] = S[left];
        return;
    }
 
    int middle = (left + right) / 2;
 
    update(pos * 2, left, middle, a);
    update(pos * 2 + 1, middle + 1, right, a);
 
    A[pos] = A[pos * 2] + A[pos * 2 + 1];
}
 
int query(int pos, int left, int right, int a, int b)
{
    if (b < left || right < a)
        return 0;
    
    if (a <= left && right <= b)
        return A[pos];
 
    int middle = (left + right) / 2;
 
    return query(pos * 2, left, middle, a, b) + query(pos * 2 + 1, middle + 1, right, a, b);
}
 
int main()
{
    fin >> N >> M;
 
    for (int i = 1; i <= N; i++)
    {
        fin >> S[i];
    }
 
    preprocess(1, 1, N);
 
    for (int i = 1; i <= M; i++)
    {
        int Opt;

        fin >> Opt;

        switch (Opt)
        {
        case 0:
        {
            int T, V;
            
            fin >> T >> V;

            S[T] -= V;

            update(1, 1, N, T);

            break;
        }
        
        case 1:
        {
            int P, Q;
            
            fin >> P >> Q;

            fout << query(1, 1, N, P, Q) << '\n';

            break;
        }
        }
    }
}