Cod sursa(job #470079)

Utilizator S7012MYPetru Trimbitas S7012MY Data 11 iulie 2010 12:22:44
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <iostream>
using namespace std;
#define DN 100001

int c[DN],n,m;

void actualizare(int ind,int val) {
	int poz=0;//pozitia celui mai nesemnificativ bit cu valoarea 1
	while(ind<=n) {
		c[ind]+=val;
		while(!(ind&1<<poz)) ++poz;
		ind+=1<<poz;
		++poz;
	}
}

int interogare(int dr) {
	int s=0,poz=0;
	while(dr>0) {
		s+=c[dr];
		while(!(dr&1<<poz)) ++poz;
		dr-=1<<poz;
		++poz;
	}
	return s;
}

int cautare(int val) {
	int i,poz;
	for(poz=1;poz<n;poz<<=1);
	for(i=0; poz; poz>>=1)
		if(i+poz<=n)
			if(val>=c[i+poz]) {
				i+=poz;
				val-=c[i];
				if(!val) return i;
			}
	return -1;
}

int main()
{
	int i,val,op,a,b;
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1; i<=n; i++) {
		scanf("%d",&val);
		actualizare(i,val);
	}
	while(m--) {
		scanf("%d",&op);
		if(op<2) {
				scanf("%d %d",&a,&b);
				if(!op)
					actualizare(a,b);
				else printf("%d\n",interogare(b)-interogare(a-1));
		}
		else {
			scanf("%d",&a);
			printf("%d\n",cautare(a));
		}
	}
	return 0;
}