Pagini recente » Cod sursa (job #1501044) | Cod sursa (job #884449) | Cod sursa (job #68617) | Cod sursa (job #758285) | Cod sursa (job #735770)
Cod sursa(job #735770)
#include<fstream>
#include<cmath>
#define lsb(x) (x&(-x))
using namespace std;
long n,m,i,aib[100001],op,a,b,nr,x,mij,aux,val;
void update(int x, int val)
{int i;
for (i = x; i <= n; i += lsb(i))//lsb(i) returneaza 2^k,k=nr de 0 finale in baza 2 ale lui i
aib[i] += val;
}
int query(int x)
{int i, ret = 0;
for (i = x; i > 0; i -= lsb(i))
ret += aib[i];
return ret;
}
void search(int a,int p,int u)
{
mij=(p+u)/2;
while(p<=u)
{ mij=(p+u)/2;
x=query(mij);
if(x<a) p=mij+1;
else
if(x>a) u=mij-1;
else
if(x==a){p=u+1; val=mij;}
else return ;
}
}
int main()
{
ifstream f("aib.in");ofstream g("aib.out");
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
update(i,x);
}
for(i=1;i<=m;i++)
{
f>>op;
if(op<2)f>>a>>b;
else f>>a;
if(op==0)update(a,b);
else
if(op==1)g<<query(b)-query(a-1)<<"\n";
else
if(op==2){ val=-1; search(a,1,n); g<<val<<"\n";}
}
f.close();g.close();
return 0;}