Cod sursa(job #459960)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 31 mai 2010 20:33:58
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb

#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;}