Pagini recente » Cod sursa (job #732557) | Cod sursa (job #822854) | Cod sursa (job #1695231) | Cod sursa (job #1600519) | Cod sursa (job #2296765)
#include <bits/stdc++.h>
#define dim 100001
using namespace std;
const int b=32000;
struct parser{
char *B,*E,*p;
parser()
{
B=new char[b+10];
E=B+b;
Load();
}
parser &operator>>(int &x)
{
while(*p<'0' || *p>'9')Next();
x=0;
while(*p>='0' && *p<='9')
{
x=x*10+*p-'0';
Next();
}
return *this;
}
void Load()
{
p=B;
memset(B,0,b);
fread(B,1,b,stdin);
}
void Next()
{
p++;
if(p==E)Load();
}
};
int n,m,v[dim],tree[dim],q,x,y;
int Search(int a)
{
int p2;
for(p2=1;p2<n;p2<<=1);
for(int i=0;p2;p2>>=1)
{
if(i+p2<=n)
{
if(a>=tree[i+p2])
{
i+=p2;
a-=tree[i];
if(!a)return i;
}
}
}
return -1;
}
int getsum(int a)
{
int sum=0;
while(a>0)
{
sum+=tree[a];
a-=a&(-a);
}
return sum;
}
void update(int a,int b)
{
while(a<=n)
{
tree[a]+=b;
a+=a&(-a);
}
}
void createTree()
{
for(int i=1;i<=n;i++)
{
update(i,v[i]);
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
parser fin;
fin>>n>>m;
for(int i=1;i<=n;i++)fin>>v[i];
createTree();
for(;m;m--)
{
fin>>q;
if(q==0)
{
fin>>x>>y;
update(x,y);
}
if(q==1)
{
fin>>x>>y;
printf("%d\n",getsum(y)-getsum(x-1));
}
if(q==2)
{
fin>>x;
printf("%d\n",Search(x));
}
}
return 0;
}