Cod sursa(job #1138496)
| Utilizator | Data | 10 martie 2014 09:48:53 | |
|---|---|---|---|
| Problema | Arbori indexati binar | Scor | 40 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 1.43 kb |
#include <cstdio>
using namespace std;
int a[100001], s[100001];
int cb (int x, int n)
{
int st=1, dr=n, m;
while (st<=dr)
{
m=(st+dr)/2;
if (s[m]==x) return m;
else if (s[m]<x) st=m+1;
else dr=m-1;
}
m=(st+dr)/2;
if (s[m]==x) return m;
return -1;
}
int main()
{
int n, m, i, j, x, y, z;
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m); s[0]=0;
for (i=1; i<=n; i++) {scanf("%d",&a[i]); s[i]=s[i-1]+a[i];}
for (i=1; i<=m; i++)
{
scanf("%d",&z);
if (z==0)
{
scanf("%d%d",&x,&y); a[x]+=y;
for (j=x; j<=n; j++) s[j]+=y;
}
else if (z==1)
{
scanf("%d%d",&x,&y);
int sum=s[y]-s[x-1];
printf("%d\n",sum);
}
else if (z==2)
{
scanf("%d",&x);
int rez=cb(x,n);
printf("%d\n",rez);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}
