Cod sursa(job #659086)

Utilizator lily3Moldovan Liliana lily3 Data 9 ianuarie 2012 23:37:18
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<fstream>
#include<algorithm>
using namespace std;

unsigned int i,n,m,k,st,dr,tip,poz,x,a[100010];
unsigned int c[100010],sum,s1,s2;
inline void aduna(int poz,int sum)
{
	while(poz<=n)
	{
		c[poz]+=sum;
		poz+=(poz&-poz);
	}
}
inline int rezolva(int poz)
{
	int s=0;
	while(poz!=0)
	{
		s+=c[poz];
		poz-=(poz&-poz);
	}
	return s;
}
inline int pozitie(int st,int dr,int sum)
{
	int i,mij,p;
	while(st<dr)
	{
		mij=(st+dr)>>1;
		p=rezolva(mij);
		if(p==sum)
			return mij;
		if(p<sum)
			st=mij+1;
		else
			dr=mij-1;
	}
	if(rezolva(st)==sum)
		return st;
			return -1;
}
int main()
{
	FILE *f=fopen("aib.in","r");
	FILE *g=fopen("aib.out","w");
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;++i)
	{
		fscanf(f,"%d",&a[i]);
		a[i]+=a[i-1];
		c[i]=a[i]-a[i-(i&-i)];
	}
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d",&tip);
		if(tip==0)
		{
			fscanf(f,"%d%d",&poz,&sum);
			aduna(poz,sum);
		}
		else
			if(tip==1)
			{
				fscanf(f,"%d%d",&st,&dr);
				s1=rezolva(dr);
				s2=rezolva(st-1);
				fprintf(g,"%d\n",s1-s2);
			}
			else
				if(tip==2)
				{
					fscanf(f,"%d",&sum);
					fprintf(g,"%d\n",pozitie(1,n,sum));
				}
	}
	return 0;
}