Cod sursa(job #2507834)

Utilizator RadianElevenAdrian Ariotn RadianEleven Data 10 decembrie 2019 21:53:38
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("datorii.in");
ofstream g ("datorii.out");
int n, q;
int vek[15005];
int logs[100007];
int aib[200005];
void update(int x, int val)
{
    int i=x;
    int p=1;
    while(p<=n)
    {
        if(i%2==0) i++;
        if((i&(i-1))*p<x && i*p>=x)
            aib[i*p]+=val;
        i/=2;
        p*=2;
    }

}
void subs(int x, int val)
{
     int i=x;
    int p=1;
    while(p<=n)
    {
        if(i%2==0) i++;
        if((i&(i-1))*p<x && i*p>=x)
            aib[i*p]+=val;
        i/=2;
        p*=2;
    }
}

int query(int poz)
{
    int s=0,p=poz;
    while(p)
    {
        s+=aib[p];
        p=p&(p-1);
    }
    return s;

}
int main()
{
    f>>n>>q;
    for(int i=1;i<=100001;++i)
    {
        logs[i]=logs[i/2]+1;
    }
 //   cout<<"j";
    for(int i=1;i<=n;++i)
    {
        f>>vek[i];
        update(i, vek[i]);
   //      cout<<"j";
    }

    for(int i=1;i<=q;++i)
    {
 //       cout<<"k";
        int t;
        f>>t;
        if(t==0)
        {
            int z, v;
            f>>z>>v;
            subs(v,z);

        }
        else {
            int p,q;
            f>>p>>q;
            int s=0;
   //         cout<<query(q)<<" "<<query(p-1);
            s=query(q)-query(p-1);
            g<<s<<"\n";
        }
    }
    return 0;
}