Cod sursa(job #2297550)

Utilizator serban24Popovici Serban-Florin serban24 Data 5 decembrie 2018 23:29:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int n,m;
int v[100005];
int sum[100005];

void update(int x, int val){
	int i;

	for(i=x;i<=n;i+=(i^(i&(i-1))))
		sum[i]+=val;
}

int query(int x){
	int suma=0;

	while(x>0){
		suma+=sum[x];
		x-=(x^(x&(x-1)));
	}

	return suma;
}

int smen(int val){
	int i=0,pas;

	for(pas=1;pas<n;pas<<=1);

	while(pas){
		if(i+pas<=n && sum[i+pas]<=val){
			i+=pas;
			val-=sum[i];
			if(!val)
				return i;
		}
		pas>>=1;
	}

	return -1;
}

int main(){
	int i,j,x,y,op;

	fin>>n>>m;

	for(i=1;i<=n;i++){
		fin>>v[i];
		for(j=i;j<=n;j+=(j^(j&(j-1))))
			sum[j]+=v[i];
	}

	for(i=1;i<=m;i++){
		fin>>op;

		if(op==0){
			fin>>x>>y;
			update(x,y);
		}
		else if(op==1){
			fin>>x>>y;
			fout<<query(y)-query(x-1)<<"\n";
		}
		else if(op==2){
            fin>>x;
            fout<<smen(x)<<"\n";
		}
	}

    return 0;
}