Pagini recente » Cod sursa (job #2180823) | Cod sursa (job #86530) | Cod sursa (job #3317472) | Cod sursa (job #3355633) | Cod sursa (job #3303393)
#include <bits/stdc++.h>
using namespace std;
const int Max = 5e5 + 10;
ifstream f("aib.in");
ofstream g("aib.out");
int N, q;
int lsb(int k)
{
return k & -k;
}
struct AIB
{
vector<long long> aib;
AIB(int n)
{
aib.resize(n + 1);
}
long long query(int k)
{
long long sum = 0;
if(k >= aib.size())
{
return -1;
}
for (int i = k; i > 0; i -= lsb(i))
{
sum += aib[i];
}
return sum;
}
void update(int k, int add)
{
for (int i = k; i < aib.size(); i += lsb(i))
{
aib[i] += add;
}
}
int cbin(long long s)
{
int ans = 0;
long long sum_ans = 0;
for(int pas = (1 << 18); pas > 0; pas /= 2)
{
if(ans + pas >= aib.size()){continue;}
if(sum_ans + aib[ans + pas] < s)
{
ans += pas;
sum_ans += aib[ans];
}
}
return ans + 1;
}
};
int main()
{
f >> N >> q;
AIB aib(N);
for(int i = 1; i <= N; ++i)
{
int a;
f >> a;
aib.update(i, a);
}
while(q--)
{
cout << "f" << endl;
int c;
f >> c;
if(c == 0)
{
int a, b;
f >> a >> b;
aib.update(a, b);
}
else if(c == 1)
{
int a, b;
f >> a >> b;
g << aib.query(b) - aib.query(a - 1) << '\n';
}
else
{
int a;
f >> a;
int b = aib.cbin(a);
if(aib.query(b) == a)
g << aib.cbin(a) << '\n';
else
g << -1 << '\n';
}
}
}