Pagini recente » Cod sursa (job #1295061) | Cod sursa (job #266965) | Cod sursa (job #1071738) | Cod sursa (job #71614) | Cod sursa (job #2138830)
#include <iostream>
#include <cstdio>
#define N 100005
using namespace std;
int x, n, m, s[N], a, b;
void update(int i, int val)
{
while(i<=n)
{
s[i]+=val;
i+=((i^(i-1))&i);
}
}
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 suma(int i)
{
int val=0;
while(i!=0)
{
val+=s[i];
i-=((i^(i-1))&i);
}
return val;
}
int caut(int x)
{
int st=1, dr=n, poz=-1;
while(st<=dr)
{
int mij=(st+dr)/2;
int sc=suma(mij);
if(sc==x)
{
poz=mij;
dr=mij-1;
}
if(sc<x)
st=mij+1;
else
dr=mij-1;
}
return poz;
}
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: printf("%d\n", suma(b)-suma(a-1)); break;
case 2: printf("%d\n", caut(a)); break;
}
}
return 0;
}