Cod sursa(job #1704066)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 17 mai 2016 23:18:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <cstring>

using namespace std;

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

int n, m, l1, i, nr, cn, tip, a, b;
int arb[15005];
char s[100000];

int suma(int poz){
    int s = 0;
    while (poz > 0){
        s += arb[poz];
        poz -= (poz ^ (poz-1)) & poz;
    }
    return s;
}

void adaug(int poz, int k){
    while (poz <= n){
        arb[poz] += k;
        poz += (poz ^ (poz-1)) & poz;
    }
}


int main(){
    f >> n >> m;

    /// Parsez citirea.
    f.get();
    f.getline(s, sizeof(s));
    l1 = strlen(s);
    cn = 0;
    for (i = 0; i < l1;){
        if (s[i] >= '0' && s[i] <= '9'){
            nr = 0;
            while (s[i] >= '0' && s[i] <= '9')
                nr = nr*10 + s[i] - '0', i++;
            cn++;
            adaug(cn, nr);
        }
        else i++;
    }
    while (m){
        f.getline(s, sizeof(s));
        cn = 0;
        l1 = strlen(s);
        for (i = 0; i < l1;){
            if (s[i] >= '0' && s[i] <= '9'){
                nr = 0;
                while (s[i] >= '0' && s[i] <= '9')
                    nr = nr*10 + s[i] - '0', i++;
                cn++;
                if (cn == 1)
                    tip = nr;
                else if (cn == 2)
                    a = nr;
                else b = nr;
            }
            else i++;
        }

        /// Raspunde la intrebari.

        if (tip == 0)
            adaug(a, -b);
        else g << suma(b) - suma(a-1) << '\n';
        m--;
    }

    return 0;
}