Pagini recente » Cod sursa (job #2301401) | Cod sursa (job #649157) | Cod sursa (job #3137378) | Cod sursa (job #2181181) | Cod sursa (job #2138635)
#include <iostream>
#include <cstdio>
#define N 100005
using namespace std;
int x, n, m, s[N], a, b;
void citire()
{
scanf("%d %d\n", &n, &m);
for(int i=1;i<=n;i++)
{
scanf("%d ", &x);
s[i]+=x;
int nrz=(i^(i-1))&i;
for(int j=nrz/2;j>=1;j/=2)
s[i]+=s[i-j];
}
}
int caut(int x)
{
int st=1, dr=n, poz=N;
while(st<=dr)
{
int mij=(st+dr)/2;
if(s[mij]==x)
if(mij<poz)
poz=mij;
if(s[mij]<x)
st=mij+1;
else
dr=mij-1;
}
if(poz==N)
poz=-1;
return poz;
}
void update(int i, int val)
{
while(i<=n)
{
s[i]+=val;
i+=(i^(i-1))&i;
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
citire();
for(int pas=0;pas<m;pas++)
{
scanf("%d %d ", &x, &a);
if(x!=2)
scanf("%d\n", &b);
else
scanf("\n");
switch(x)
{
case 0: update(a, b); break;
case 1: if(a!=b)
printf("%d\n", s[b]-s[a-1]);
else
printf("%d\n", s[b]); break;
case 2: printf("%d\n", caut(a)); break;
}
}
return 0;
}