Pagini recente » Cod sursa (job #136511) | Cod sursa (job #882111) | Cod sursa (job #1976035) | Cod sursa (job #1219094) | Cod sursa (job #2916507)
#include <iostream>
#include <fstream>
///#include <tryhardmode>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
const int NMAX=1e5+5;
int v[NMAX],aib[NMAX];
int n;
long long bcmm;
int lsb(int x)
{
return x^(x&(x-1));
}
void update(int p,int val)
{
while(p<=n)
{
aib[p]=aib[p]+val;
p=p+lsb(p);
}
}
void update2(int p,int val)
{
v[p]=v[p]+val;
while(p<=n)
{
aib[p]=aib[p]+val;
p=p+lsb(p);
}
}
long long solve1(int p)
{
long long s=0;
while(p>0)
{
s=s+aib[p];
p=p-lsb(p);
}
return s;
}
long long solve2(int val)
{
long long s=0,p=0,i;
for(i=bcmm;i>0;i=i/2)
{
if(p+i<=n)
{
if(s+aib[p+i]<val)
{
s=s+aib[p+i];
p=p+i;
}
}
}
if(s+v[p+1]!=val)
return -1;
else
return p+1;
}
int main()
{
int m,i,j,t,a,b;
fin>>n>>m;
bcmm=1;
for(i=1;i<=n;i++)
{
fin>>v[i];
update(i,v[i]);
}
while(bcmm*2<=n)
bcmm=bcmm*2;
for(i=1;i<=m;i++)
{
fin>>t;
if(t==0)
{
fin>>a>>b;
update(a,b);
}
else if(t==1)
{
fin>>a>>b;
fout<<solve1(b)-solve1(a-1)<<"\n";
}
else
{
fin>>a;
fout<<solve2(a)<<"\n";
}
}
return 0;
}