Cod sursa(job #222017)

Utilizator hadesgamesTache Alexandru hadesgames Data 19 noiembrie 2008 11:52:47
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
#define cnt 1<<20
unsigned int arb[100005];
int n;
int bit(int x)
{
	return (x&(x-1))^x;
}
unsigned int query(int x)
{
	 if (x==0)
		 return 0;
	 return arb[x]+query(x-bit(x));
}
void adauga(int x,int y)
{
	arb[x]+=y;
	while((x+=bit(x))<=n)
	{
		arb[x]+=y;
	}

}
int ver(int rez,unsigned int  x)
{
	if (rez>n)
		return 1;
	if (query(rez)>=x)
		return 1;
	return 0;
}
void afis()
{
	int i;
	FOR(i,1,n)
		printf("%d ",arb[i]);
	printf("\n");
}
int main()
{
	FILE *in,*out;
	int x,y,i,m,j;
	unsigned int rez,z;
	in=fopen("aib.in","r");
	out=fopen("aib.out","w");
	fscanf(in,"%d%d",&n,&m);
	FOR(i,1,n)
	{
		fscanf(in,"%d",&x);
		adauga(i,x);
	}
	//afis();
	FOR(i,1,m)
	{
		fscanf(in,"%d",&x);
		if (x==0)
		{
			fscanf(in,"%d%d",&x,&y);
			adauga(x,y);
			continue;
		}
		if (x==1)
		{
			fscanf(in,"%d%d",&x,&y);
			fprintf(out,"%u\n",query(y)-query(x-1));
			continue ;
		}
		fscanf(in,"%u",&z);
		rez=0;
		for(j=cnt;j;j>>=1)
		{
			rez+=j;
			if (ver(rez,z))
				rez-=j;
		}
		rez++;
		if (query(rez)!=z)
			fprintf(out,"-1\n");
		else
			fprintf(out,"%u\n",rez);
	
	}
	fclose(in);
	fclose(out);
	return 0;
}