Pagini recente » Cod sursa (job #1463739) | Cod sursa (job #151882) | Cod sursa (job #75381) | Cod sursa (job #45354) | Cod sursa (job #1948481)
#include <cstdio>
#define LMAX 100005
using namespace std;
FILE *fin=fopen("aib.in","r");
FILE *fout=fopen("aib.out","w");
int aib[LMAX];
int n;
int sum(int poz);
int pozmin(int suma);
void update(int start, int adun);
int main()
{
int i;
int m, a;
int c;
int x, y;
int yp;
int s1, s2;
fscanf(fin,"%d %d",&n,&m);
for (i=1;i<=n;i++)
{
fscanf(fin,"%d",&a);
update(i,a);
}
for (i=1;i<=m;i++)
{
fscanf(fin,"%d",&c);
if (c==0)
{
fscanf(fin,"%d %d",&x,&y);
update(x,y);
}
else if (c==1)
{
fscanf(fin,"%d %d",&x,&y);
s1=sum(x-1);
s2=sum(y);
fprintf(fout,"%d\n",s2-s1);
}
else
{
fscanf(fin,"%d",&x);
fprintf(fout,"%d\n",pozmin(x));
}
}
fclose(fin);
fclose(fout);
return 0;
}
void update(int start, int adun)
{
int i;
for (i=start;i<=n;i+=(i&(-1*i)))
aib[i]+=adun;
}
int sum(int poz)
{
int sum=0;
for (;poz>=1;poz-=(poz&(-poz)))
sum+=aib[poz];
return sum;
}
int pozmin(int suma)
{
int st, dr;
int m;
int suu;
int pm=2*n;
st=0;
dr=n+1;
while (st<=dr)
{
m=(st+dr)/2;
suu=sum(m);
if (suu==suma)
{
if (m<pm)
pm=m;
dr=m-1;
}
else if (suu>suma)
dr=m-1;
else st=m+1;
}
return pm;
}