Cod sursa(job #1269014)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 21 noiembrie 2014 19:27:51
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <iostream>
#include <cstdio>
#include <vector>
std::vector<int> v;
std::vector<int> aib;

void update(int pos, int delta)
{
    for(int i = pos; i<aib.size(); i+=i&(~i+1))
    {
        aib[i]+=delta;
    }
}

int query(int left, int right)
{
    int s=0;
    for(int i=right; i; i=i&(i-1))
    {
        s+=aib[i]; 
    }
    for(int i=left-1; i;i=i&(i-1))
    {
        s-=aib[i];
    }
    return s;
}

int main ()
{
    FILE *fin=fopen("datorii.in","r");
    FILE *fout = fopen("datorii.out","w");
    int n,m,x;
    fscanf(fin,"%d%d",&n,&m);

    int size;

    for(size=1;size<n;size*=2){}

    aib.resize(size+1);

    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&x);
        update(i, x);
    }
    int opt, left, right, pos, val;
    for(int i=1; i<=m; i++)
    {
        fscanf(fin, "%d", &opt);
        if(opt)
        {
            fscanf(fin, "%d%d", &left, &right);
            fprintf(fout,"%d\n", query(left, right));
        }
        else
        {
            fscanf(fin, "%d%d", &pos, &val);
            update(pos,-val); 
        }
    }
    
    return 0;
}