Pagini recente » Cod sursa (job #2866403) | Cod sursa (job #1612562) | Cod sursa (job #1134867) | Cod sursa (job #1043286) | Cod sursa (job #2058933)
#include <cstdio>
#define Nmax 100005
using namespace std;
FILE *in = fopen("aib.in","r");
FILE *out = fopen("aib.out","w");
int n,t,aib[Nmax];
void adauga(int poz,int s)
{
while(poz<=n)
{
aib[poz]+=s;
poz+=(poz&(-poz));
}
}
int query(int poz)
{
int suma=0;
while(poz!=0)
{
suma+=aib[poz];
poz-=(poz&(-poz));
}
return suma;
}
int sumin(int suma)
{
int r=0,pas=1<<15;
while(pas)
{
if(r+pas<n)
if(query(r+pas)<suma)
r+=pas;
pas/=2;
}
if(query(r+1)==suma)
return r+1;
return -1;
}
int main()
{
fscanf(in,"%d%d",&n,&t);
for(int i=1;i <= n ;i++)
{
int x;
fscanf(in,"%d",&x);
adauga(i,x);
}
/* for(int i=1;i <= n ;i++)
fprintf(out,"%d ",query(i));*/
while(t)
{
int cer,x,y;
fscanf(in,"%d",&cer);
if(cer==0)
{
fscanf(in,"%d%d",&x,&y);
adauga(x,y);
}
else if(cer==1)
{
fscanf(in,"%d%d",&x,&y);
fprintf(out,"%d\n",query(y)-query(x-1));
}
else
{
fscanf(in,"%d",&x);
fprintf(out,"%d\n",sumin(x));
}
t--;
}
return 0;
}