Pagini recente » Cod sursa (job #2353001) | Cod sursa (job #1166560) | Cod sursa (job #802470) | Cod sursa (job #3132419) | Cod sursa (job #1193117)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#if __cplusplus > 199711L
#include <unordered_map>
#include <unordered_set>
#endif
#include <cstdio>
#include <ctime>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef long long int64;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 100010;
int N, M;
int AIB[NMAX];
void add(int pos, const int &value)
{
int nr_0 = 0;
while(pos <= N)
{
AIB[pos] += value;
while(!(pos & (1 << nr_0))) ++nr_0;
pos += (1 << nr_0);
++nr_0;
}
}
int sum(int pos)
{
int nr_0 = 0, ret = 0;
while(pos >= 1)
{
ret += AIB[pos];
while(!(pos & (1 << nr_0))) ++nr_0;
pos -= (1 << nr_0);
++nr_0;
}
return ret;
}
int min_k(int sum)
{
int step, i;
for (step = 1; step < N; step <<= 1);
for (i = 0; step; step >>= 1)
{
if (i + step > N) continue;
if (sum >= AIB[i + step])
{
i += step;
sum -= AIB[i];
if (sum == 0)
return i;
}
}
return -1;
}
int main()
{
int i, value, op, a, b;
fin >> N >> M;
for (i = 1; i <= N; ++i)
{
fin >> value;
add(i, value);
}
while(M--)
{
fin >> op >> a;
if (op == 0) fin >> b, add(a, b);
else if (op == 1) fin >> b, fout << sum(b) - sum(a - 1) << '\n';
else fout << min_k(a) << '\n';
}
fin.close();
fout.close();
return 0;
}