Cod sursa(job #680387)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 15 februarie 2012 15:28:04
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 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 || s==0) 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 solve ()
{
	int i,j,x,y,tip;
	ifstream f("aib.in");
	f>>n>>m;
	for (int i=1;i<=n;i++)
	{	
		f>>y;
		x=i+(i&(-i));
		aib[i]+=y; 
		if (x<=n) aib[x]+=aib[i]; 
	}
	FILE *g=fopen ("aib.out","w");
	for (i=1;i<=m;i++)
	{
		f>>tip;
		switch (tip)
		{
		case 0 : { f>>x>>y; update (x,y); break ; }
		case 1 : { f>>x>>y; fprintf (g,"%d\n",query1 (x,y )) ; break ; }
		case 2 : { f>>x; fprintf (g,"%d\n",query2(x)); break ; }
		}
	}
	fclose(g);
	f.close();
}
		

int main ()
{
	solve();
	return 0;
}