Pagini recente » Cod sursa (job #2794096) | Cod sursa (job #1911238) | Cod sursa (job #1575277) | Cod sursa (job #1828731) | Cod sursa (job #1860628)
#include <fstream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
void add (unsigned int pos, unsigned int val);
unsigned int sum (unsigned int position);
int binsrc (unsigned int val);
unsigned int N, M;
unsigned int A;
unsigned int type;
unsigned int a, b;
unsigned int arr[100001];
unsigned int i;
unsigned int sol;
int main ()
{
fin >> N >> M;
for (i=1; i<=N; i++)
{
fin >> A;
add(i,A);
}
for (i=1; i<=M; i++)
{
fin >> type;
if (type == 0)
{
fin >> a >> b;
add(a,b);
}
else if (type == 1)
{
fin >> a >> b;
sol = sum(b) - sum(a-1);
fout << sol << '\n';
}
else
{
fin >> a;
sol = binsrc(a);
fout << sol << '\n';
}
}
return 0;
}
void add (unsigned int pos, unsigned int val)
{
while (pos <= N)
{
arr[pos] += val;
pos += (pos^(pos-1))&pos;
}
}
unsigned int sum (unsigned int pos)
{
unsigned int sum;
sum = 0;
while (pos > 0)
{
sum += arr[pos];
pos -= (pos^(pos-1))&pos;
}
return sum;
}
int binsrc (unsigned int val)
{
unsigned int i, k;
i = 0;
k = 1;
while (k < N)
k *= 2;
while (k > 0)
{
if (i+k <= N)
if (sum(i+k) == val)
return i+k;
else if (sum(i+k) < val)
i += k;
k /= 2;
}
return -1;
}