Cod sursa(job #431983)

Utilizator vladbBogolin Vlad vladb Data 1 aprilie 2010 18:41:16
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
#include<cstdio>

#define maxn 100001

using namespace std;

ifstream fin("aib.in");

int n,m,poz;
int c[maxn];

void modifica(int ind,int val)
{	poz=0;
	while(ind<=n)
	{	c[ind]+=val;
		while(!(ind & (1<<poz)))
			poz++;
		ind+=(1<<poz);
		poz++;
	}
}

int suma(int ind)
{	int s=0;
	poz=0;
	while(ind>0)
	{	s+=c[ind];
		while(!(ind &(1<<poz))) 
			poz++;
		ind-=(1<<poz);
		poz+=1;
	}
	return s;
}

int cauta(int sum)
{	int ind=n+1,b=n,lst=0,ldr=n+1,s;
	s=suma(b);
	if(s==sum) ind=n;

	while(b)
	{	b=(lst+ldr)>>1;
		s=suma(b);
		if(s>sum)
		{	if(ldr>b) ldr=b;
			b--;
		}
		else if(s==sum){ ind=min(ind,b);
						 ldr=b;
						 b--;
						}
		else 
		{	if(lst<b) lst=b;
			b++;
		}
		if(b<=lst) break;
		if(b>=ldr) break;
	}
	if(ind==n+1) return -1;
	return ind;
}

int main()
{	freopen("aib.in","w",stdout);
	int i,x,y,k;
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{	fin>>x;
		modifica(i,x);
	}
	for(i=1;i<=m;i++)
	{	fin>>k;
		if(k!=2)
		{	fin>>x>>y;
			if(k==1) printf("%d\n",suma(y)-suma(x-1));
			else modifica(x,y);
		}
		else 
		{	fin>>x;
			printf("%d\n",cauta(x));
		}
	}
	fin.close();
	fclose(stdout);
	return 0;
}