Pagini recente » Cod sursa (job #2886682) | Cod sursa (job #1311955) | Borderou de evaluare (job #1293085) | Cod sursa (job #666216) | Cod sursa (job #459960)
Cod sursa(job #459960)
#include<cstdio>
#include<fstream>
using namespace std;
#define nn 100001
int v[nn];
int n,m;
int t,x,y;
void upd (int p,int val)
{
for(;p<=n;p+=p^(p-1)&p)
v[p]+=val;
}
int que (int p)
{
int s;
for(s=0;p;p-=p^(p-1)&p)
s+=v[p];
return s;
}
int srch (int S)
{
int st=1,dr=n;
while(st<=dr){
int mid=(st+dr)/2;
int s=que(mid);
if(s==S)
return mid;
if(s<S)
st=mid+1;
else
dr=mid-1;
}
return -1;
}
int main ()
{
ifstream in ("aib.in");
freopen("aib.out","w",stdout);
in>>n>>m;
for(int i=1;i<=n;++i){
in>>x;
upd(i,x);}
while(m){
in>>t;
switch(t){
case 0:
in>>x>>y;
upd(x,y);
break;
case 1:
in>>x>>y;
printf("%d\n",(que(y)-que(x-1)));
break;
case 2:
in>>x;
printf("%d\n",srch(x));
break;
}
--m;}
in.close();
return 0;}