Pagini recente » Cod sursa (job #3151385) | Cod sursa (job #2030474) | Cod sursa (job #1506726) | Cod sursa (job #1520066) | Cod sursa (job #1744384)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[100001];
int n;
int query(int x)
{
int sol=0;
for(int i=x;i>0;i=(i&(i-1)))
{
sol+=aib[i];
}
return sol;
}
void update(int x,int y)
{
for(int i=x;i<=n;i=2*i-(i&(i-1)))
{
aib[i]+=y;
}
}
int caut(int s)
{
int st,dr,m,sum,sol;
st=1; dr=n; sol=-1;
while(st<=dr)
{
m=(st+dr)/2;
sum=query(m);
if(sum==s)
{
sol=m;
dr=m-1;
break;
}
else if(sum>=s)
dr=m-1;
else
st=m+1;
}
return sol;
}
int main()
{
int m;
in>>n>>m;
for(int i=1;i<=n;i++)
{
in>>aib[i];
aib[i]+=query(i-1)-query(i&(i-1));
}
for(int i=1;i<=m;i++)
{
int op;
in>>op;
if(op==0)
{
int x,y;
in>>x>>y;
update(x,y);
}
else if(op==1)
{
int x,y;
in>>x>>y;
out<<query(y)-query(x-1)<<'\n';
}
else
{
int x;
in>>x;
out<<caut(x)<<'\n';
}
}
}