Cod sursa(job #2230405)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 9 august 2018 23:41:47
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>

#define MaxN 15005
#define TreeSize (int)(4 * MaxN + 50)

std::ifstream InFile("datorii.in");
std::ofstream OutFile("datorii.out");

int N, M;
// Explanation for Dummies like me (nu degeaba am stat cat am stat in fata unui calculator cu biti)
// Magic[x] - da suma ultimelor x&(-x) numere, terminandu-se cu pozitia x
// x&(-x) da bitul cel mai din dreapta
// Numarul de pe pozitia x este cu siguranta continut de x + x&(x-1) si de aia adaugam in Update
int Magic[MaxN];
int Val[MaxN];

void Update(int Position, int Value) {
    while(Position <= N) {
        Magic[Position] += Value;
        Position += Position&(-Position);
    }
}

int Query(int Position) {
    int Sum = 0;

    while(Position) {
        Sum += Magic[Position];
        Position -= Position&(-Position);
    }

    return Sum;
}

void Citire() {
    InFile >> N >> M;

    for (int i=0, x; i<N; i++) {
        InFile >> x;

        Update(i+1, x);
    }
}

void Rezolvare() {
    for (int i=0, QueryType, x, y; i<M; i++) {
        InFile >> QueryType;
        InFile >> x >> y;

        if(QueryType == 1)
            OutFile << Query(y) - Query(x-1) << '\n';
        else
            Update(x, -y);
    }
}

int main()
{
    Citire();
    Rezolvare();

    return 0;
}