Pagini recente » Cod sursa (job #519890) | Cod sursa (job #1272343) | Cod sursa (job #778740) | Cod sursa (job #1776503) | Cod sursa (job #1948464)
#include <cstdio>
#define LMAX 100005
using namespace std;
FILE *fin=fopen("aib.in","r");
FILE *fout=fopen("aib.out","w");
int s[LMAX];
int lsb[LMAX];
int aib[LMAX];
int n;
int sum(int poz);
int pozmin(int suma);
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);
s[i]=a+s[i-1];
}
for (i=1;i<=n;i++)
lsb[i]=(i&(-i));
for (i=1;i<=n;i++)
aib[i]=s[i]-s[i-lsb[i]];
for (i=1;i<=m;i++)
{
fscanf(fin,"%d",&c);
if (c==0)
{
fscanf(fin,"%d %d",&x,&y);
for (yp=x;yp<=n;yp+=lsb[yp])
aib[yp]+=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;
}
int sum(int poz)
{
int sum=0;
for (;poz>=1;poz-=lsb[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;
}