Cod sursa(job #680332)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 15 februarie 2012 14:39:50
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<time.h>
#include <iostream>
#include <fstream>

using namespace std;

int n,m,aib[100005];

inline int query2 (int x )
{
	int i,s=0,poz=0;
	for (i=1;i<=n>>1;i<<=1);
	for (;i>0;i>>=1)
		if (poz+i<=n && x>=s+aib[poz+i]) { poz+=i; s+=aib[poz]; }
	if (s!=x) return -1;
	return poz;
}

inline int query1 ( int x, int y )
{
	int s=0;
	--x;	
	for (;x>0;x-=(x&(-x)))
		s-=aib[x];
	
	for (;y>0;y-=y&(-y))
		s+=aib[y];
	return s;
}

inline void update (int poz, int val )
{
	for (;poz<=n;poz+=poz&(-poz))
		aib[poz]+=val;
}

void makeaib(FILE *f)
{
	int x,y;
	fscanf (f,"%d%d",&n,&m);
	for (int i=1;i<=n;i++)
	{	
		fscanf (f,"%d",&y);
		x=i+(i&(-i));
		aib[i]+=y; 
		if (x<=n) aib[x]+=aib[i]; 
	} 
}

void solve (FILE *f)
{
	int i,j,x,y,tip;
	FILE *g=fopen ("aib.out","w");
	for (i=1;i<=m;i++)
	{
		fscanf (f,"%d",&tip);
		switch (tip)
		{
		case 0 : { fscanf (f,"%d%d",&x,&y); update (x,y); break ; }
		case 1 : { fscanf (f,"%d%d",&x,&y); fprintf (g,"%d\n",query1 (x,y )) ; break ; }
		case 2 : {fscanf (f,"%d",&x); fprintf (g,"%d\n",query2(x)); break ; }
		}
	}
	fclose(g);
}
		

int main ()
{
	FILE *f=fopen ("aib.in","r");
	makeaib(f);
	solve(f);
	fclose(f);
	return 0;
}