Cod sursa(job #1231473)

Utilizator BFlorin93Balint Florin-Lorand BFlorin93 Data 20 septembrie 2014 19:17:59
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>

#define left(x) ((x^(x-1))&x)

using namespace std;

int *aib;
int n;
int m;


void Pay(int pos,int ammount)
{
    for (int i=pos;i<=n;i+=left(i))
        {
            aib[i] -= ammount;
        }
}

void Add(int pos,int ammount)
{
    for (int i=pos;i<=n;i+=left(i))
        {
            aib[i] += ammount;
        }
}

int Compute(int pos)
{
    int ret = 0;

    for (int i=pos;i>0;i-=left(i))
    {
        ret += aib[i];
    }

    return ret;
}



int main()
{

    //open files
    FILE *infile,*outfile;
    infile = fopen("datorii.in","r");
    outfile = fopen("datorii.out","w");
   //initialize inputs
   fscanf(infile,"%d",&n);
   fscanf(infile,"%d",&m);

   aib = new int[n+1];
   
   for (int i=1;i<=n;i++)
   {
       aib[i] = 0;
   }

   int index;
   for (int i=1;i<=n;i++)
   {	 
    fscanf(infile,"%d",&index);
    Add(i,index);
   }


    //do operations;
   for (int i =1 ;i<=m;i++)
   {
       char bit;
       fscanf(infile,"%d",&bit);

       if (bit == '0')
       {
           int day,ammount;
           fscanf(infile,"%d%d",day,ammount);

           Pay(day,ammount);
       }

       else
       {
           int dayFrom,toDay;
           fscanf(infile,"%d%d",dayFrom,toDay);

		   fprintf(outfile,"%d\n", (Compute(toDay) - Compute(dayFrom-1)) );
       }
   }

    return 0;
}