Cod sursa(job #825844)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 29 noiembrie 2012 18:36:13
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<iostream>
#include<fstream>
using namespace std;

#define NMAX 100001

int c[NMAX],n;

inline int LSB(int x)
{
	return x & (-x);
}
int query(int n)
{
	int i,s;
	s=0;
	for(i=n;i>=1;i=i-LSB(i))
		s=s+c[i];
	return s;
}

void update(int i, int x)
{
	for( ;i<=n;i=i+LSB(i))
		c[i]=c[i]+x;
}

int cautarebinara(int x)
{
	int st,dr,mij;
	st=0;
	dr=n+1;
    while(dr-st>1) {
		mij=(st+dr)/2;
		if(query(mij)<=x)
			st=mij;
		else dr=mij;
    }
    if(dr==n+1 || query(dr)!=x)
        return -1;
    else return dr;
}

int main ()
{
	int i,m,a,b,opt;
	ifstream f("aib.in");
	ofstream g("aib.out");
	f>>n>>m;
	for(i=1;i<=n;i++) {
		f>>a;
		update(i,a);
	}
	for(i=1;i<=m;i++) {
		f>>opt;
		if(opt==0) {
			f>>a>>b;
			update(a,b);
		}
		else if(opt==1) {
			f>>a>>b;
			g<<query(b)-query(a-1)<<'\n';
		}
		else {
			f>>a;
			g<<cautarebinara(a)<<'\n';
		}
	}
	f.close();
	g.close();
	return 0;
}