Cod sursa(job #659071)

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

int i,j,n,m,k,st,dr,tip,poz,x,a[100010];
unsigned long long c[100010],rez,s1,s2,sum;
inline void aduna(int poz,int sum)
{
	while(poz<=n)
	{
		c[poz]+=sum;
		poz+=(poz&-poz);
	}
}
inline int rezolva(int st,int dr)
{
	s1=0,s2=0;
	while(dr!=0)
	{
		s1+=c[dr];
		dr-=(dr&-dr);
	}
	while(st!=0)
	{
		s2+=c[st];
		st-=(st&-st);
	}
	return s1-s2;
}
inline int pozitie(int sum)
{
	int i;
	for(i=1;i<=n;++i)
		if(rezolva(0,i)==sum)
			return i;
		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);
				fprintf(g,"%d\n",rezolva(st-1,dr));
			}
			else
				if(tip==2)
				{
					fscanf(f,"%d",&sum);
					fprintf(g,"%d\n",pozitie(sum));
				}
	}
	return 0;
}