Pagini recente » Cod sursa (job #3252893) | Cod sursa (job #3172214) | Atasamentele paginii oni2014_ziua_ix | Atasamentele paginii Poze preONI 2007 - deschidere | Cod sursa (job #1760376)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int n, m, a[100005], aib[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))
aib[i]+=y;
}
int determinareSuma(int x, int y)
{
int s1=0, s2=0;
for(int i=y; i>=1; i-=zero(i))
s1+=aib[i];
for(int i=1; i<x; i+=zero(i))
s2+=aib[i];
return s1-s2;
}
int determinarePozitieMinima(int x)
{
int st=1, dr=n;
while(st<=dr)
{
int mij=(st+dr)/2, suma=determinareSuma(st, dr);
if(suma==x)
return dr;
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)
{
scanf("%d", &a[i]);
for(int j=i; j<=n; j+=zero(j))
aib[j]+=a[i];
}
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", aib[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;
}