Cod sursa(job #633689)

Utilizator cnt_tstcont teste cnt_tst Data 14 noiembrie 2011 15:26:53
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>

#define DIM 100001

int A[DIM];
int N, i, x, y, z, M;


inline int lsb(int x){
	return x&-x;
}

void update(int x, int v) {
	for (;x<=N;x+=lsb(x))
		A[x]+=v;
}

int query(int x) {
	int s;
	for (s=0;x;x-=lsb(x))
		s+=A[x];
	return s;
}

int op3(int k) {
	int p = 1, u = N, m;
	while (p<=u) {
		m = (p+u)/2;
		if (query(m) >= k)
			u = m-1;
		else
			p = m+1;
	}
	return p;
}

int main() {
	FILE *f = fopen("aib.in","r");
	FILE *g = fopen("aib.out","w");
	fscanf(f,"%d %d",&N, &M);
	for (i=1;i<=N;i++) {
		fscanf(f,"%d",&x);
		update(i, x);
	}
	for (i=1;i<=M;i++) {
		fscanf(f,"%d",&x);
		if (x == 0) {
			fscanf(f,"%d %d",&y, &z);
			update(y,z);
		} else if (x == 1) {
			fscanf(f,"%d %d",&y, &z);
			fprintf(g,"%d\n",query(z) - query(y-1));
		} else {
			fscanf(f,"%d",&y);
			fprintf(g,"%d\n",op3(y));
		} 
			
	}
	fclose(f);
	fclose(g);
	
	
	return 0;
}