Pagini recente » Cod sursa (job #2874013) | Cod sursa (job #2453419) | Cod sursa (job #1916947) | Cod sursa (job #1419973) | Cod sursa (job #2694166)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int const nmax = 100000;
int aib[nmax + 5];
int n;
void update(int poz, int val) {
while(poz <= n) {
aib[poz] += val;
poz += (poz ^ (poz & (poz - 1)));
}
}
int query(int poz) {
int sum = 0;
while(0 < poz) {
sum += aib[poz];
poz = poz & (poz - 1);
}
return sum;
}
int bs(int target) {
int st = 1, dr = n + 1;
while(st < dr) {
int med = (st + dr) >> 1;
if(query(med) < target)
st = med + 1;
else
dr = med;
}
if(query(dr) != target)
return -1;
return dr;
}
int main()
{
int m;
fin >> n >> m;
for(int i = 1; i <= n; i++) {
int var;
fin >> var;
update(i, var);
}
while(m--) {
int tip, a, b;
fin >> tip;
if(tip == 0) {
fin >> a >> b;
update(a, b);
} else if(tip == 1) {
fin >> a >> b;
fout << query(b) - query(a - 1) << "\n";
} else {
fin >> a;
fout << bs(a) << "\n";
}
}
return 0;
}