Pagini recente » Cod sursa (job #702129) | Cod sursa (job #143653) | Cod sursa (job #2753313) | Cod sursa (job #731636) | Cod sursa (job #1760992)
#include <cstdio>
using namespace std;
int n, m;
int aib[100100];
int gasirePutere(int x)
{
return ((x ^ (x - 1)) & x);
}
void citire()
{
scanf("%d %d", &n, &m);
int tmp;
for(int i = 1; i <= n; i++)
{
scanf("%d", &tmp);
int nr = i;
while(nr <= n)
{
aib[nr] += tmp;
nr += gasirePutere(nr);
}
}
}
int sum(int x, int y)
{
int suma = 0;
int nr = y;
while(nr >= 1)
{
suma += aib[nr];
nr -= gasirePutere(nr);
}
nr = x - 1;
while(nr >= 1)
{
suma -= aib[nr];
nr -= gasirePutere(nr);
}
return suma;
}
int gasireSuma(int sumaCautata)
{
int sumaPartiala;
int x, y, m;
x = 1;
y = n;
while(x <= y)
{
m = (x + y) / 2;
sumaPartiala = sum(1, m);
if(sumaPartiala == sumaCautata)
{
return m;
}
else if(sumaPartiala > sumaCautata)
{
y = m - 1;
}
else
{
x = m + 1;
}
}
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
citire();
for(int k = 0; k < m; k++)
{
int tmp1, tmp2, tmp3;
scanf("%d", &tmp1);
if(tmp1 == 0)
{
scanf("%d %d", &tmp2, &tmp3);
int nr = tmp2;
while(nr <= n)
{
aib[nr] += tmp3;
nr += gasirePutere(nr);
}
}
else if(tmp1 == 1)
{
scanf("%d %d", &tmp2, &tmp3);
printf("%d\n", sum(tmp2, tmp3));
}
else if(tmp1 == 2)
{
scanf("%d", &tmp2);
printf("%d\n", gasireSuma(tmp2));
}
}
return 0;
}