Pagini recente » Cod sursa (job #1003698) | Cod sursa (job #567261) | Cod sursa (job #1769431) | Cod sursa (job #491148) | Cod sursa (job #2133165)
#include <cstdio>
#include <cmath>
#define MAXN 100001
int aib[MAXN],n;
inline void update(int p,int val)
{
while(p<=n)
{
aib[p]+=val;
p+=p&(-p);
}
}
inline int query(int p)
{
int s=0;
while(p)
{
s+=aib[p];
p-=p&(-p);
}
return s;
}
inline int cbin(int s)
{
int i=0,pas=log2(n);
for(pas=1<<pas;pas;pas>>=1)
if(i+pas<=n && aib[i+pas]<=s)
i+=pas,s-=aib[i];
if(s)
return -1;
return i;
}
int main()
{
FILE *fin,*fout;
fin=fopen("aib.in","r");
fout=fopen("aib.out","w");
int x,m,tip,y;
fscanf(fin,"%d%d",&n,&m);
for(int i=0;i<n;i++)
{
fscanf(fin,"%d",&x);
update(i+1,x);
}
for(int i=0;i<m;i++)
{
fscanf(fin,"%d%d",&tip,&x);
if(tip==2)
fprintf(fout,"%d\n",cbin(x));
else
{
fscanf(fin,"%d",&y);
if(tip)
fprintf(fout,"%d\n",query(y)-query(x-1));
else
update(x,y);
}
}
fclose(fin);
fclose(fout);
return 0;
}