Pagini recente » Borderou de evaluare (job #3364497) | Borderou de evaluare (job #3365526) | Borderou de evaluare (job #3365326) | Borderou de evaluare (job #3365527) | Cod sursa (job #3364862)
#include <bits/stdc++.h>
#include <fstream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
struct AIB
{
int sz;
vector<long long> a;
AIB(int n)
{
sz=n;
a.assign(n+2,0);
}
void add(long long x,long long v)
{
for(;x<=sz;x+=x&-x)a[x]+=v;
}
long long query(long long x)
{
long long s=0;
for(;x>0;x-=x&-x)s+=a[x];
return s;
}
long long queryX(int l,int r)
{
if(l>r)return 0;
return query(r)-query(l-1);
}
};
int main()
{
int N,M;
fin>>N>>M;
vector<int> v(N+1);
AIB bit(N);
for(int i=1;i<=N;i++)
{
fin>>v[i];
bit.add(i,v[i]);
}
while(M--)
{
int tip;
fin>>tip;
if(tip==0)
{
int a,b;
fin>>a>>b;
bit.add(a,b);
}
else
if(tip==1)
{
int a,b;
fin>>a>>b;
fout<<bit.queryX(a,b)<<'\n';
}
else
if(tip==2)
{
int a,k=0;
fin>>a;
int st=1;
int dr=N;
while(st<=dr)
{
int mij=(st+dr)/2;
if(bit.query(mij)==a)
{
k=mij;
break;
}
else
if(bit.query(mij)<a)
{
st=mij+1;
}
else
{
dr=mij-1;
}
}
if(k>0)fout<<k<<'\n';
else
fout<<-1<<'\n';
}
}
return 0;
}