Pagini recente » Cod sursa (job #562774) | Cod sursa (job #1697058) | Cod sursa (job #2395348) | Cod sursa (job #3005181) | Cod sursa (job #2158654)
#include <iostream>
#include <fstream>
#define DMAX 100000
#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){
int st = 1, dr = n, mij;
int pozitie = n + 1;
while(st <= dr){
mij = (st + dr) / 2;
int suma = sumaPanaIn(mij);
if(suma == val){
pozitie = min(mij, pozitie);
dr = mij - 1;
}else if(suma < val){
st = mij + 1;
}else if(suma > val){
dr = mij - 1;
}
}
if(pozitie > n || pozitie < 1){
return -1;
}
return pozitie;
}
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;
}