Cod sursa(job #1274944)

Utilizator lokixdSebastian lokixd Data 24 noiembrie 2014 16:42:27
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 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;
}