Pagini recente » Cod sursa (job #2896210) | Cod sursa (job #2249231) | Cod sursa (job #1266054) | Cod sursa (job #622120) | Cod sursa (job #2134578)
#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 zeros(int x) { return (x^(x-1))&x; }
void Update(int x,int value)
{
for(int i=x;i<=N;i+=zeros(i))
BIT[i]=BIT[i]+value;
}
int Sum(int x)
{
int sum=0;
for(int i=x;i>=1;i-=zeros(i))
sum=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;
}