Cod sursa(job #789119)

Utilizator adascaluAlexandru Dascalu adascalu Data 16 septembrie 2012 22:07:30
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
using namespace std;
#include<cstdio>
#include<vector>
#define nmax 15001
#define value y
#define day x
inline int t_zeros(int x)
{
	int i;
	for(i=0;!(((x^(x-1))&x)&(1<<i-1));i++);
	return i;
}
FILE *g=fopen("datorii.out","w");
vector<long int> v(nmax);
vector<long int> c(nmax,0);
int main ()
{
	unsigned int n,m,op,x,y,i;
	long sx,sy;
	FILE *f=fopen("datorii.in","r");
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++)
		fscanf(f,"%ld",&v[i]);
	for(i=1;i<=n;i++)
	{	
		if(t_zeros(i)) op=i-(1<<(t_zeros(i)-1))+1;
		else op=i;
		for(;op<=i;++op)
			c[i]+=v[op];
	}
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d%d%d",&op,&x,&y);
		if(op&1)
		{
			sx=sy=0;
			--x;
			while(x)
			{
				sx+=c[x];
				if(t_zeros(x)) x-=1<<(t_zeros(x)-1);
				else	--x;
			}
			while(y)
			{
				sy+=c[y];
				if(t_zeros(y)) y-=1<<(t_zeros(y)-1);
				else	--y;
			}
			fprintf(g,"%ld\n",sy-sx);
		}
		else
			while(x<=n)
				c[x]-=y,(t_zeros(x)) ?x+=1<<(t_zeros(x)-1):x++;
		
	}
	fclose(f);
	fclose(g);
	return 0;
}