Pagini recente » Cod sursa (job #2732399) | Cod sursa (job #2627200) | Cod sursa (job #907073) | Cod sursa (job #1116484) | Cod sursa (job #2136999)
#include <bits/stdc++.h>
#define NMax 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M;
int BIT[NMax];
inline int LSB(int x) { return x&(-x); }
void Update(int x,int value)
{
for(int i=x;i<=N;i+=LSB(i))
BIT[i]+=value;
}
int Sum(int x)
{
int sum=0;
for(int i=x;i>=1;i-=LSB(i))
sum+=BIT[i];
return sum;
}
int Search(int value)
{
int step,vals=0,index=0;
for(step=1;step<=N;step<<=1);
for(step;step;step>>=1)
if(index+step<=N && vals+BIT[index+step]<=value)
vals+=BIT[index+=step];
return index;
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++)
{
int x;
fin>>x;
Update(i,x);
}
for(int i=1;i<=M;i++)
{
int op,x,y;
fin>>op;
if(op==0)
{
fin>>x>>y;
Update(x,y);
}
if(op==1)
{
fin>>x>>y;
fout<<Sum(y)-Sum(x-1)<<"\n";
}
if(op==2)
{
fin>>x;
int index=Search(x);
if(1<=index && index<=N && Sum(index)==x)
fout<<index<<"\n";
else
fout<<"-1\n";
}
}
return 0;
}