Cod sursa(job #2537198)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 3 februarie 2020 12:21:11
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,v[1005],aib[1005];
int lsb (int nr) {
	return (nr & (nr-1));
}
void build_aib () {
	for(int i=1;i<=n;++i)
		aib[i]=v[i]-v[i-lsb(i)];
}
void updatee (int poz, int nr) {
	while(poz<=n) {
		aib[poz]+=nr;
		poz=poz+lsb(poz);
	}
}
int querrys (int dr) {
	int suma=0;
	while(dr>0) {
		suma+=aib[dr];
		dr=dr-lsb(dr);
	}
	return suma;
} 
int querrys1 (int nr) {
	int i=0,step=1;
	for(;(step<<1)<=n;step<<=1);
	for(;step>0;step>>=1)
		if(i+step<=n && querrys(i+step)<nr)
			i+=step;
	return i+1;
}
int main () {
	int q,nr1,nr2;
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d", &n, &m);++m;
	for(int i=1;i<=n;++i)
		scanf("%d", &v[i]),v[i]+=v[i-1];
	build_aib();
	while(--m) {
		scanf("%d", &q);
		if(q==0)
			scanf("%d%d", &nr1, &nr2),updatee(nr1,nr2),cout<<1;
		else if (q==1)
			scanf("%d%d", &nr1, &nr2),printf("%d\n", (querrys(nr2)-querrys(nr1-1))),cout<<1;
		else {
			scanf("%d", &nr1);
			if(querrys(querrys1(nr1))==nr1)
				printf("%d\n", querrys1(nr1));
			else
				printf("-1\n");
			cout<<1;
		}
	}
	return 0;
}