Cod sursa(job #1721167)

Utilizator andrew_assassin789Andrei Manea andrew_assassin789 Data 24 iunie 2016 17:46:45
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#define nmax 15005
using namespace std;
unsigned long long abi[nmax];
unsigned short v[nmax];
unsigned int n;
void add(unsigned int i)
{
    unsigned int x=i;
    while (x<=n)
    {
        abi[x]+=v[i];
        x+=(x&(-x));
    }
}
void setv(unsigned int i, unsigned int val)
{
    unsigned int x=i;
    while (x<=n)
    {
        abi[x]-=v[i];
        abi[x]+=val;
        x+=(x&(-x));
    }
}
unsigned long long getsum(unsigned int i)
{
    unsigned int x=i;
    unsigned long long sum=0;
    while (x)
    {
        sum+=abi[x];
        x&=(x-1);
    }
    return sum;
}
int main()
{
    ifstream f("datorii.in");
    ofstream g("datorii.out");
    unsigned int i,m,x,y,op;
    unsigned long long rez;
    f>>n>>m;
    for (i=1;i<=n;i++)
    {
        f>>v[i];
        if (v[i]) add(i);
    }
    for (i=1;i<=m;i++)
    {
        f>>op>>x>>y;
        if (!op)
        {
            setv(x,v[x]-y);
            v[x]-=y;
        }
        else
        {
            rez=getsum(y)-getsum(x-1);
            g<<rez<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}