Cod sursa(job #680293)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 15 februarie 2012 12:55:57
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>

using namespace std;

int n,m,aib[100005],v[100005];

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;
}

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;
}

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

void makeaib()
{
	for (int i=1;i<=n;i++)
		update (i,v[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);
}
		
void citire (FILE *f)
{
	fscanf (f,"%d%d",&n,&m);
	for (int i=1;i<=n;++i)
		fscanf (f,"%d",&v[i]);
}

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