Pagini recente » Cod sursa (job #3031638) | Cod sursa (job #1384109) | Cod sursa (job #55550) | Cod sursa (job #3151862) | Cod sursa (job #2808505)
#include <bits/stdc++.h>
#define zero(x) x&(-x)
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,i,x,tip,y,aib[100005];
void update(int x, int dff)
{
for(;x<=n;x+=zero(x))aib[x]+=dff;
}
int query(int x)
{
int rez=0;
for(;x>0;x-=zero(x))rez+=aib[x];
return rez;
}
int getsum(int x, int y)
{
return query(y)-query(x-1);
}
int cbin(int v)
{
int st=1,dr=n,m,poz=0,x,k;
while(st<=dr)
{
m=(st+dr)>>1;
x=query(m);
if(x<=v)
{
poz=m;
k=x;
st=m+1;
}
else dr=m-1;
}
if(poz&&k==v)return poz;
return -1;
}
int main()
{
fin.tie(nullptr);
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>x;
update(i,x);
}
while(m--)
{
fin>>tip>>x;
if(tip==2)
{
fout<<cbin(x)<<'\n';
continue;
}
fin>>y;
if(tip)fout<<getsum(x,y)<<'\n';
else update(x,y);
}
return 0;
}