Cod sursa(job #662567)

Utilizator lily3Moldovan Liliana lily3 Data 16 ianuarie 2012 20:09:50
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
using namespace std;
long i,j,n,m,a[100010],c[100010],tip,a1,a2,s1,s2,s;
void schimba(int poz,int x)
{
	while(poz<=n)
	{
		c[poz]+=x;
		poz+=(poz&-poz);
	}
}
int sumint(int poz)
{
	int s=0;
	while(poz!=0)
	{
		s+=c[poz];
		poz-=(poz&-poz);
	}
	return s;
}
int detpoz(int s)
{
	int st=1,dr=n,mij,sum=0;
	while(st<dr)
	{
		mij=(st+dr)/2;
		sum=sumint(mij);
		if(sum==s)
			return mij;
			if(sum<s)
				st=mij+1;
			else
				if(sum>s)
				dr=mij-1;
	}
	if(sumint(st)==s)
		return st;
	return -1;
}
int main()
{
	FILE *f=fopen("aib.in","r");
	FILE *g=fopen("aib.out","w");
	fscanf(f,"%d%d",&n,&m);
	a[0]=0;
	for(i=1;i<=n;++i)
	{
		fscanf(f,"%ld",&a[i]);
		a[i]+=a[i-1];
		c[i]=a[i]-a[i-(i&-i)];
	}
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%ld",&tip);
		if(tip==0)
		{
			fscanf(f,"%ld%ld",&a1,&a2);
		schimba(a1,a2);
		}
		else
			if(tip==1)
			{
				fscanf(f,"%ld%ld",&a1,&a2);
				s1=sumint(a1-1);
				s2=sumint(a2);
				fprintf(g,"%ld\n",s2-s1);
			}
			else
			{
				fscanf(f,"%d",&s);
				fprintf(g,"%d\n",detpoz(s));
			}
	}
	return 0;
}