Cod sursa(job #632306)

Utilizator Robert29FMI Tilica Robert Robert29 Data 10 noiembrie 2011 20:59:23
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
FILE*f=fopen("aib.in","r");
FILE*g=fopen("aib.out","w");
int n,m,a,b,x,w[100001],v[100001];
int main() {
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		fscanf(f,"%d",&v[i]);
	for(int i=1;i<=n;++i){
		int y=(i^(i-1))&i;
		for(int j=i-y+1;j<=i;++j)
			w[i]+=v[j];
	}
	for(int i=1;i<=m;++i){
		fscanf(f,"%d",&x);
		if(!x){
			fscanf(f,"%d%d",&a,&b);
			while(a<=n){
				w[a]+=b;
				a+=(a^(a-1))&a;
			}
		}else if(x==1){
			fscanf(f,"%d%d",&a,&b);
			a--;
			int x=0;
			int y=0;
			while(b){
				x+=w[b];
				b-=(b^(b-1))&b;
			}
			while(a){
				y+=w[a];
				a-=(a^(a-1))&a;
			}
			fprintf(g,"%d\n",x-y);
		}else{
			fscanf(f,"%d",&a);
			b=1;
			while(w[b]<a)
				b*=2;
			int aa=w[b/2];
			int st=b/2;
			int dr=b;
			int mm;
			while(st+2<=dr){
				mm=(st+dr)/2;
				if(aa+w[mm]<a){
					aa+=w[mm];
					st=mm;
				}else if(aa+w[mm]>a)
					dr=mm;
				else
					break;				
			}
			if(st+2<=dr)
				fprintf(g,"%d\n",mm);
			else if(w[b]==a)
				fprintf(g,"%d\n",b);
			else
				fprintf(g,"-1\n");
		}
		
	}
	
	fclose(g);
	fclose(f);
	return 0;
}