Pagini recente » Cod sursa (job #2905842) | Cod sursa (job #2872376) | Cod sursa (job #368301) | Cod sursa (job #1524509) | Cod sursa (job #3230233)
#include <iostream>
#include <fstream>
using namespace std;
const int N = 100005;
ifstream f("aib.in");
ofstream g("aib.out");
int zero(int x) { return (x ^ (x - 1)) & x; }
int n, v[N], aib[N], m;
void add(int a, int b) {
for (int i = a; i <= n; i += zero(i))
aib[i] += b;
}
void construieste() {
for (int i = 1; i <= n; i++){
int start = max(1, i - zero(i) + 1);
for (int j = start; j <= i; j++)
aib[i] += v[j];
}
}
int query(int a) {
//suma elem pana la poz a
int sum = 0;
for (int i = a; i > 0; i -= zero(i))
sum += aib[i];
return sum;
}
int main()
{
f >> n>>m;
for (int i = 1; i <= n; i++)
f >> v[i];
construieste();
/*for (int i = 1; i <= n; i++)
cout << aib[i] << " ";
cout << "\n";*/
while (m--) {
int tip;
f >> tip;
if (tip == 0) {
int a, b;
f >> a >> b;
add(a,b);
}
else if (tip == 1){
int a, b;
f >> a >> b;
g << query(b) - query(a - 1) << " \n";
}
else {
int a;
f >> a;
int st = 1;
int dr = n;
int sol = 0;
while (st < dr) {
int mij = (st + dr) / 2;
if (query(mij) == a)
{
sol = mij;
break;
}
if (query(mij) > a)
dr = mij - 1;
else
st = mij + 1;
}
if (sol != 0)
g << sol << "\n";
else
g << st << "\n";
}
}
}