Pagini recente » Cod sursa (job #2905943) | Cod sursa (job #2222068) | Arhiva de probleme | Cod sursa (job #322452) | Cod sursa (job #2238137)
#include<cstdio>
#include<fstream>
using namespace std;
FILE *f=fopen("aib.in","r");
ofstream g("aib.out");
int n,aib[100002],pw;
int querysum(int poz)
{
int sol=0,i;
for(i=poz;i>=1;i-=i&-i)
sol+=aib[i];
return sol;
}
void update(int poz,int add)
{
int i;
for(i=poz;i<=n;i+=i&-i)
aib[i]+=add;
}
void rez(int s)
{
int p=pw,ok=0,i=0;
while(ok==0&&p>=1)
{
if(aib[i+p]==s)
{
ok=1;
g<<i+p<<'\n';
}
else
if(aib[i+p]<s)
{
i+=p;
s-=aib[p];
p/=2;
}
else
{
p/=2;
}
while(i+p>n&&p>=1)
p/=2;
}
if(ok==0)
g<<-1<<'\n';
}
int main()
{
int m,x,y,p,i;
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(f,"%d",&x);
update(i,x);
}
pw=1;
while(pw<=n)
pw*=2;
pw/=2;
for(i=1;i<=m;i++)
{
fscanf(f,"%d",&p);
if(p==0)
{
fscanf(f,"%d%d",&x,&y);
update(x,y);
}
else
if(p==1)
{
fscanf(f,"%d%d",&x,&y);
g<<querysum(y)-querysum(x-1)<<'\n';
}
else
{
fscanf(f,"%d",&x);
rez(x);
}
}
return 0;
}