Pagini recente » Cod sursa (job #1915476) | Cod sursa (job #1376512) | Cod sursa (job #495366) | Cod sursa (job #665799) | Cod sursa (job #244502)
Cod sursa(job #244502)
#include <stdio.h>
using namespace std;
#define IN "aib.in"
#define OUT "aib.out"
#define DIM 100001
FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");
int n,m,t;
int arb[DIM]={0};
int c,s;
inline int minim(int,int);
void update(int,int);
int query(int);
int search(int);
int main()
{
int k,x,y;
int i;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(fin,"%d",&t);
update(i,t);
}
for(;m;m--)
{
fscanf(fin,"%d",&k);
if(k<2)
{
fscanf(fin,"%d%d",&x,&y);
if(!k)
update(x,y);
else
fprintf(fout,"%d\n",(query(y)-query(x-1)));
}
else
{
fscanf(fin,"%d",&x);
fprintf(fout,"%d\n",(search(x)));
}
}
fclose(fin);
fclose(fout);
return 0;
}
int search(int val)
{
int i,pas;
for(pas=1;pas<n;pas<<=1);
for(i=0;pas;pas>>=1)
{
if(i+pas<=n)
{
if(val>=arb[i+pas])
{
i=i+pas;
val=val-arb[i];
if(!val)
return i;
}
}
}
return -1;
}
void update(int poz,int val)
{
c=0;
while(poz<=n)
{
arb[poz]=arb[poz]+val;
while(!(poz & (1<<c)))
c++;
poz=poz+(1<<c);
c=c+1;
}
}
int query(int poz)
{
c=0,s=0;
while(poz>0)
{
s=s+arb[poz];
while(!(poz & (1<<c)))
c++;
poz=poz-(1<<c);
c=c+1;
}
return s;
}
inline int minim(int a, int b)
{
if(a<b)
return a;
return b;
}