Pagini recente » Cod sursa (job #994088) | Cod sursa (job #2257769) | Cod sursa (job #1916627) | Cod sursa (job #3263531) | Cod sursa (job #1151337)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
int n, T;
int arb[100010];
int bit(int x)
{
return x&(~(x-1));
}
void add(int poz, int val)
{
if(!poz || poz > n)
return;
arb[poz] += val;
add(poz+bit(poz), val);
}
int sum(int x)
{
if(!x || x > n)
return 0;
return arb[x]+sum(x - bit(x));
}
int caut(int x)
{
int crt = 1;
int rez = 0;
while(crt <= n)
crt<<=1;
crt>>=1;
while(crt)
{
if(arb[crt+rez] <= x)
{
x-=arb[crt+rez];
rez+=crt;
}
if(x == 0)
return rez;
crt >>= 1;
}
return -1;
}
void citire()
{
scanf("%d%d", &n, &T);
int x;
for(int i = 1; i <= n; i++)
{
scanf("%d", &x);
add(i, x);
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
citire();
int tip, x, y;
while(T--)
{
scanf("%d", &tip);
switch(tip)
{
case 0:
scanf("%d%d", &x, &y);
add(x, y);
break;
case 1:
scanf("%d%d", &x, &y);
printf("%d\n", sum(y) - sum(x-1));
break;
case 2:
scanf("%d", &x);
printf("%d\n", caut(x));
}
}
return 0;
}