Pagini recente » Cod sursa (job #2512708) | Cod sursa (job #1235480) | Cod sursa (job #366668) | Cod sursa (job #2589193) | Cod sursa (job #1148390)
#include <iostream>
#include <fstream>
#include <stdio.h>
#define nmax 100001
using namespace std;
long sum[nmax];
long a,b,n,m, sol ;
void update(int poz , int val)
{
while (poz <= n)
{
int p = 0;
while (!(poz & (1 << p)) ) {p++;}
sum[poz] += val;
poz += (1<<p);
}
}
long query(int num)
{
int s = 0;
while (num > 0)
{
int p = 0;
while (!(num & (1 << p)) ) {p++;}
s += sum[num];
num -= (1 << p);
}
return s;
}
int search(long val)
{
int s = 1; while(s < n) {s = s << 1;}
int v = 0;
while (s)
{
if (v + s <=n)
if (val >= sum[v+s])
{
v += s;
val -= sum[v];
if (val == 0) {return v;}
}
s = s >> 1;
}
return -1;
}
int main()
{
freopen("aib.in" , "r" , stdin);
freopen("aib.out", "w" ,stdout);
scanf("%d%d",&n,&m );
for (int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
update(i,x);
}
for (int i =1;i<=m;i++)
{
int x;
scanf("%d",&x);
if (x == 0) { int poz; scanf("%d%d",&poz,&a); update(poz,a); }
else if (x == 1)
{ scanf("%i%i",&a,&b);
sol = query(b) - query(a-1);
printf("%d\n",sol);
}
else
{
int k; scanf("%d",&k);
printf("%d\n",search(k));
}
}
return 0;
}