Cod sursa(job #195500)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 19 iunie 2008 09:44:55
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>
#include<string.h>
#define bit 100005
inline int min(int a, int b) {
	if(a<b)
		return a;
	return b;
}
int n,m,T;
int Arb[bit];
int C,S;
int Query(int poz){
    C=0,S=0;
    while(poz>0){
		S+=Arb[poz];
		while(!(poz&(1<<C)))
			C++;
		poz-=(1<<C);
		C+=1;
    }
    return S;
}
int solve(int Sum){
    int pos=n+1,B;
    int limst=0, limdr=n+1;
    B=n;
    S=Query(B);
    if(S==Sum)
		pos=n;
    while(B){
		B=(limst+limdr)>>1;
		S=Query(B);
		if(S>Sum){
			if(limdr>B)
				limdr=B;
			B-=1;
		}
		else
			if(S==Sum)
				pos=min(pos,B), limdr=B, B-=1;
		else{
			if(limst<B)
				limst=B;
			B+=1;
		}
		if(B<=limst)
			break;
		if(B>=limdr)
			break;   
    }
    if(pos==n+1)
		return -1;
    return pos;
}
void Update(int poz, int val){
	C=0;
	while(poz<=n){
		Arb[poz]+=val;
		while(!(poz&(1<<C)))
			C++;
		poz+=(1<<C);
		C+=1;
	}
}
int main(){
    memset(Arb,0,sizeof(Arb));
    int K,X,Y;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i){
        scanf("%d",&T);
        Update(i,T);
    }
    for(;m;--m){
        scanf("%d",&K);
        if(K<2){
			scanf("%d%d",&X,&Y);
			if(!K)
				Update(X,Y);
			else
				printf("%d\n",Query(Y)-Query(X-1));
        }
        else{
            scanf("%d",&X);
            printf("%d\n",solve(X));
        }
    }
}