Pagini recente » Cod sursa (job #107406) | Cod sursa (job #759632) | Cod sursa (job #2858572) | Cod sursa (job #1134410) | Cod sursa (job #1425532)
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Nmax 100004
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
int n, i, j, m;
int v[Nmax],aib[Nmax];
int sum(int x)
{
int suma = 0, i;
for (i = x;i >= 1; i -= zeros(i) )
suma += aib[i];
return suma;
}
void add(int x, int y)
{
int i;
for (i = x; i <= n; i += zeros(i) )
aib[i] += y;
}
void querry0()
{
int a, b;
scanf("%d %d", &a, &b);
add(a, b);
}
void querry1()
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", sum(b) - sum(a - 1));
}
int querry2()
{
int a, pas = 1<<16, i = 0;
scanf("%d", &a);
while (pas)
{
if (i + pas <= n && sum(i+pas) < a)
i += pas;
pas /= 2;
}
if (sum(i + 1) == a)
return i + 1;
return -1;
}
int main()
{
int q = 0;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &n, &m);
for (i = 1; i<= n; ++i)
{
scanf("%d", &v[i]);
add(i,v[i]);
}
while (m--)
{
scanf("%d", &q);
if (q == 0) querry0();
else if (q == 1) querry1();
else printf("%d\n", querry2());
}
return 0;
}