Cod sursa(job #1469163)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 7 august 2015 17:35:48
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>

#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)

using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
int N,M;
int aib[15010];
// rezolvare cu arbori indexati binar
void update(int,int);
int query(int);

int main()
{
    f>>N>>M;
    FOR (i,1,N) {
        int x;
        f>>x;
        update(i,x);
    }
    FOR (i,1,M) {
        int tip,x,y;
        f>>tip>>x>>y;
        if (!tip) {
            update(x,-y);
        }
        else {
            g<<query(y)-query(x-1)<<'\n';
        }
    }
    f.close();g.close();
    return 0;
}

void update(int poz,int val) {
    int C=0;
    while (poz<=N) {
        aib[poz]+=val;
        while (!(poz&(1<<C))) {
            ++C;
        }
        poz+=(1<<C);
        ++C;
    }
}

int query(int poz) {
    int C=0,S=0;
    while (poz) {
        S+=aib[poz];
        while (!(poz&(1<<C))) {
            ++C;
        }
        poz-=(1<<C);
        ++C;
    }
    return S;
}