Cod sursa(job #1170568)

Utilizator silvatheviprersilviu catioiu silvatheviprer Data 13 aprilie 2014 20:30:58
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <stdio.h>
#include <memory.h>
#define MAXARBELS 15001
long aib [MAXARBELS];
long n,m;
void Operare(long id, long vl)
{
    long poz=id;
    while (poz<=n)
    {
        aib[poz]+=vl;
        poz+=poz^(poz-1)&poz;
    };
};
long InterogareSimpla(long panla)
{
    if (panla==0) return 0;
    long sum=0;
    long poz=panla;
    while (poz)
    {
        sum+=aib[poz];
        poz-=poz^(poz-1)&poz;
    };
    return sum;
};
long Interogare(long dela, long panla)
{
    if (dela!=1)
    {
        return Interogare(1,panla)-Interogare(1,dela-1);
    }
    else
    {
        long sum=0;
        long poz=panla;
        while (poz)
        {
            sum+=aib[poz];
            poz-=poz^(poz-1)&poz;
        };
        return sum;
    };
};
void PrecomputeStuff(void)
{
//	memset(p2,0,n*sizeof(long));
//	p2[0]=1; p2[1]=2;
    long i,poz;
//	for (i=2; i<=MAXPOW2; i++) { p2[i]=p2[i-1]*2; };
//	memset(c0,0,n*sizeof(long));
    /*	for (i=1; i<=n; i++) {
    		if (c0[i]==0) {
    			if (c0[i+1]==0) c0[i+1]=1;
    		} else {
    			poz=i;
    			while (poz<=n) {
    				if (c0[poz+p2[c0[poz]]]==0) c0[poz+p2[c0[poz]]]=c0[poz]+1;
    				poz+=p2[c0[poz]];
    			};
    		};
    	};*/
    /*	for (i=1; i<=n; i++) {
                  c0[i]=i^(i-1)&i;
            };*/
//	for (i=1; i<=n; i++) {
//		if (p2[c0[i]]!=( ((i)&(i-1))^(i)  )) prlongf("error at %ld; %ld insteadof %ld\n",i,c0[i],((i)&(i-1)^(i)));
//	};
    memset(aib,0,n*sizeof(long));
};
int main (void)
{
    FILE * fi=fopen("datorii.in","r");
    FILE * fo=fopen("datorii.out","w");
    fscanf(fi,"%ld %ld",&n,&m);
    long i,x;
    PrecomputeStuff();
    for (i=0; i<n; i++)
    {
        fscanf(fi,"%ld",&x);
        Operare(i+1,x);
    };
    long pa,pb;
    long op;
    for (i=0; i<m; i++)
    {
        fscanf(fi,"%ld %ld %ld",&op,&pa,&pb);
        if (op==0)
        {
            Operare(pa,-pb);
        }
        else
        {
            fprintf(fo,"%ld\n",InterogareSimpla(pb)-InterogareSimpla(pa-1));
        };
    };
    fclose(fi);
    fclose(fo);
    return 0;
};