Pagini recente » Cod sursa (job #3164630) | Cod sursa (job #3143167) | Cod sursa (job #821929) | Cod sursa (job #2625854) | Cod sursa (job #1624228)
#include <cstdio>
#define MAXN 100100
#include <vector>
using namespace std;
vector<int> tree;
int n, Q;
void update(int idx, int val)
{
while(idx<=n)
{
tree[idx]+=val;
idx+=(idx&-idx);
}
}
int read(int idx)
{
int sum=0;
while(idx>0)
{
sum+=tree[idx];
idx-=(idx&-idx);
}
return sum;
}
int cauta(int val)
{
int i, step;
for(step=1;step<n;step<<=1);
for(i=0;step;step>>=1)
if(i+step<=n)
{
if(val>=tree[i+step])
{
i+=step;
val-=tree[i];
if(!val) return i;
}
}
return -1;
}
void initializare()
{
int i;
scanf("%d%d", &n, &Q);
tree.assign(n+1,0);
int x;
for(i=1;i<=n;++i)
{
scanf("%d", &x);
update(i, x);
}
}
void rezolva_problema()
{
initializare();
int q,t,x,y;
for(q=0;q<Q;++q)
{
scanf("%d", &t);
if(t<=1)
{
scanf("%d%d", &x, &y);
if(t==0)
update(x, y);
else
printf("%d\n", read(y)-read(x-1));
}
else
{
scanf("%d", &x);
printf("%d\n", cauta(x));
}
}
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w",stdout);
rezolva_problema();
return 0;
}