Pagini recente » Cod sursa (job #3187901) | Cod sursa (job #3252136) | Cod sursa (job #3235361) | Cod sursa (job #3180378) | Cod sursa (job #2609384)
//#include <iostream>
#include <fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int Max=100005;
int flip(int x) {return (x & (-x) );}
int n,m,aib[Max];
int suma(int x)
{
int s=0;
for(int i=x;i>=1;i-=flip(i))
s+=aib[i];
return s;
}
int suminterval(int a,int b)
{
return suma(b)-suma(a-1);
}
void update(int x,int val)
{
for(int i=x;i<=n;i+=flip(i))
aib[i]+=val;
}
int cautarebin(int x)
{
int st=1,dr=n;
while(st<=dr)
{
int mij=(st+dr)/2; int s=suma(mij);
if(s==x)
return mij;
else if(s<x)
st=mij+1;
else
dr=mij-1;
}
return -1;
}
int main()
{
in>>n>>m; int x;
for(int i=1;i<=n;i++)
{
in>>x; update(i,x);
}
int p,a,b;
for(int i=1;i<=m;i++)
{
in>>p; if(p==0) {in>>a>>b; update(a,b);}
else if(p==1) {in>>a>>b; out<<suminterval(a,b)<<"\n"; }
else
{
in>>a; out<<cautarebin(a)<<"\n";
}
}
return 0;
}