Pagini recente » Cod sursa (job #3194514) | Cod sursa (job #1599585) | Cod sursa (job #1433275) | Cod sursa (job #364988) | Cod sursa (job #2285205)
#include<stdio.h>
#include<iostream>
#include<fstream>
using namespace std;
#define MAXN 100000
int N,M;
int BT[MAXN+1];
int getSum(int index){
int sum = 0;
while(index>0) {
sum += BT[index];
index -= index & (-index);
}
return sum;
}
void updateBT(int index, int val) {
while (index <= N) {
BT[index] += val;
index += index & (-index);
}
}
int suma;
int findmink(int left,int right){
int l=1,r=N;
int mid,s;
while(left <= right){
mid=(left+right)/2;
s=getSum(mid);
if(s==suma)
return mid;
if(suma<s){
right=mid-1;
}
else{
left=mid+1;
}
}
return -1;
}
int main(){
freopen("aib.in", "r", stdin);
//freopen("arbint_test5.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &N,&M);
int v;
for(int i=0;i<N;i++){
scanf("%d", &v);
updateBT(i+1,v);
}
int a,b,tip,sum,rez;
for(int i=0;i<M;i++){
scanf("%d",&tip);
switch(tip){
case 0:
// adunare valoare
scanf("%d %d",&a,&b);
updateBT(a,b);
break;
case 1:
// interogare suma
scanf("%d %d",&a,&b);
sum=getSum(b)-getSum(a-1);
printf("%d\n",sum);
break;
case 2:
// minimum k
scanf("%d",&suma);
rez=findmink(1,N);
printf("%d\n",rez);
break;
}
}
return 0;
}