Pagini recente » Cod sursa (job #1890749) | Cod sursa (job #569705) | Cod sursa (job #636273) | Cod sursa (job #1747931) | Cod sursa (job #1540145)
#include <fstream>
#include <stdio.h>
#define zeros(x)((x^(x-1))&x)
#define Ndim 100001
#define in "aib.in"
#define out "aib.out"
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int AIB[Ndim],N,M;
void update(int poz, int quantity)
{
int i;
for(i=poz;i<=N; i+=zeros(i))
{
AIB[i]+=quantity;
}
}
int query(int x)
{
int i,val=0;
for(i=x;i>0;i-=zeros(i))
{
val+=AIB[i];
}
return val;
}
int Search(int val)
{
int i,step;
for(step=1;step<N;step<<=1);
for(i=0; step; step >>= 1)
{
if(i+step <= N)
{
if(val >=AIB[i+step])
{
i+=step;
val -= AIB[i];
if(!val)
return i;
}
}
}
return -1;
}
int main()
{
int i,a,b,k,x;
freopen(in, "r", stdin);
freopen(out,"w",stdout);
scanf("%d%d", &N, &M);
for(i=1;i<=N;i++)
{
scanf("%d", &x);
update(i,x);
}
for(;M;M--)
{
scanf("%d",&k);
if(k<2)
{
scanf("%d%d", &a,&b);
if(!k)
update(a,b);
else
printf("%d\n", query(b)-query(a-1));
}
else
{
scanf("%d",&a);
printf("%d\n", Search(a));
}
}
return 0;
}