Pagini recente » Cod sursa (job #1846842) | Cod sursa (job #2499457) | Cod sursa (job #1016127) | Cod sursa (job #285290) | Cod sursa (job #3230237)
#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;
}
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()
{
cin >> n>>m;
for (int i = 1; i <= n; i++)
{
cin >> v[i];
add(i, v[i]);
}
while (m--) {
int tip;
cin >> tip;
if (tip == 0) {
int a, b;
cin >> a >> b;
add(a,b);
}
else if (tip == 1){
int a, b;
cin >> a >> b;
cout << query(b) - query(a - 1) << "\n";
}
else {
int a;
cin >> 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)
cout << sol << "\n";
else
{
if(query(st)==a)
cout << st << "\n";
else if (query(st-1) == a)
cout << st-1 << "\n";
else if (query(st=1) == a)
cout << st+1 << "\n";
}
}
}
}