Pagini recente » Cod sursa (job #3279329) | Cod sursa (job #2982358) | Cod sursa (job #1020622) | Cod sursa (job #1485817) | Cod sursa (job #1760859)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, m, a[100005];
int zero(int t)
{
int q=(t^(t-1))&t;
return q;
}
void adaugare(int x, int y)
{
for(int i=x; i<=n; i+=zero(i))
a[i]+=y;
}
int determinareSuma(int x, int y)
{
int s1=0, s2=0;
for(int i=y; i>=1; i-=zero(i))
s1+=a[i];
for(int i=x-1; i>=1; i-=zero(i))
s2+=a[i];
return s1-s2;
}
int determinarePozitieMinima(int x)
{
int st=1, dr=n;
while(st<=dr)
{
int mij=(st+dr)/2, suma=determinareSuma(1, mij);
if(suma==x)
return mij;
if(suma>x)
dr=mij-1;
else
st=mij+1;
}
return -1;
}
void citire()
{
scanf("%d %d", &n, &m);
for(int i=1; i<=n; ++i)
{
int x;
scanf("%d", &x);
adaugare(i, x);
}
for(int i=1; i<=m; ++i)
{
int c, x, y;
scanf("%d", &c);
if(c==0)
{
scanf("%d %d", &x, &y);
adaugare(x, y);
}
else if(c==1)
{
scanf("%d %d", &x, &y);
if(x==y)
printf("%d\n", a[x]);
else
printf("%d\n", determinareSuma(x, y));
}
else if(c==2)
{
scanf("%d", &x);
printf("%d\n", determinarePozitieMinima(x));
}
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
citire();
return 0;
}