Pagini recente » Cod sursa (job #910286) | Cod sursa (job #2688679) | Cod sursa (job #443937) | Cod sursa (job #2913313) | Cod sursa (job #2157735)
#include <iostream>
#include <fstream>
#define DMAX 100001
#define pozBit(x) (x & (-x))
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[DMAX], n;
int m;
void actualizareAIB(int val, int plec){
for(int i = plec; i <= n; i+=pozBit(i)){
aib[i] += val;
}
}
void citire(){
in >> n >> m;
for(int i = 1; i <= n; i++){
int temp;
in >> temp;
actualizareAIB(temp, i);
}
}
int sumaPanaIn(int indice){
int suma = 0;
for(int i = indice; i > 0; i-= pozBit(i)){
suma += aib[i];
}
return suma;
}
int cautPoz(int val){//prin scaderi
int indicePoz = 0, index;
for(index = 1; index <= n; index = index<<1);
for(; index > 0; index = index >> 1){
if(index + indicePoz <= n && val >= aib[index + indicePoz]){
indicePoz += index;
val-=aib[indicePoz];
if(!val){
return indicePoz;
}
}
}
return -1;
}
void rezolvare(){
for(int i = 1; i <= m; i++){
int caz;
in >> caz;
switch(caz){
case 0:{
int a, b;
in >> a >> b;
actualizareAIB(b, a);
break;
}
case 1:{
int a, b;
in >> a >> b;
out << sumaPanaIn(b) - sumaPanaIn(a - 1)<<'\n';
break ;
}
case 2:{
int a;
in >> a;
out << cautPoz(a) <<'\n';
break ;
}
}
}
}
int main() {
citire();
rezolvare();
return 0;
}