Cod sursa(job #3149931)

Utilizator andystarzSuna Andrei andystarz Data 13 septembrie 2023 18:18:10
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <fstream>

using namespace std;
int aib[100005];
int v[100005];
int lsb(int a)
{
    return (a&-a);
}
int n;
void update (int poz, int val)
{
    for (int i=poz; i<=n; i+=lsb(i))
    {
        aib[i]+=val;
    }
    return;
}
int query(int p1)
{
    int sum=0;
    for (int i=p1; i>0; i-=lsb(i))
    {
        sum+=aib[i];
    }
    return sum;
}
int main()
{
    ifstream cin ("datorii.in");
    ofstream cout ("datorii.out");
    ///ok deci structura aibului
    ///fiecare pozitie tine minte combinatia celor lsb pozitii dinaintea sa
    ///apoi cand suntem interogati de un in interval, ii tot
    ///luam in mod repetat lsb-ul
    ///cand dam update la o pozitie, tot crestem cu lsb-ul pozitiei curente
    int q, cer, a, b;
    cin>>n>>q;
    for (int i=1; i<=n; i++)
    {
        cin>>a;
        update(i, a);
    }
    /*for (int i=1; i<=n; i++)
    {
        cout<<aib[i]<<" ";
    }*/
    for (int i=0; i<q; i++)
    {
        cin>>cer>>a>>b;
        if (cer==0)
        {
            update(a, -b);
        }
        else
        {
            cout<<query(b)-query(a-1)<<'\n';
        }
    }
}