Pagini recente » Cod sursa (job #888211) | Cod sursa (job #2327505) | Cod sursa (job #2757510) | Cod sursa (job #1019710) | Cod sursa (job #725177)
Cod sursa(job #725177)
#include<cstdio>
#include<cmath>
const int MAX_N = 15001 ;
const int MAX_NR = 250 ;
int n,m;
int v[MAX_N];
int nr[MAX_NR];
int nrgrupe;
int sumegrupe[MAX_NR];
int sum[MAX_NR];
int main()
{
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&v[i]);
int rad = (int)sqrt(n) ;
int num = 0 ;
for(int i=1;i<=n;++i)
{
if(num>=n)
break;
num+=rad;
nr[i]=rad;
nrgrupe = i ;
}
if(num>n)
nr[++nrgrupe] = n - num ;
for(int i=1;i<=nrgrupe;++i)
sumegrupe[i] = sumegrupe[i-1] + nr[i] ;
int gr=1;
for(int i=1;i<=n;++i)
{
if(i>sumegrupe[gr])
++gr;
sum[gr]+=v[i];
}
for(int i=1;i<=m;++i)
{
int rez=0;
int cod,a,b;
scanf("%d%d%d",&cod,&a,&b);
if(cod==0)
{
int grupa_a = (a-1) / rad + 1 ;
v[a] -= b ;
sum[grupa_a] -= b ;
}
if(cod==1)
{
int grupa_a = (a-1) / rad + 1 ;
int grupa_b = (b-1) / rad + 1 ;
if(grupa_a < grupa_b)
{
for(int j=a;j<=sumegrupe[grupa_a];++j)
rez+=v[j];
for(int j=grupa_a + 1 ; j<= grupa_b - 1 ;++j)\
rez+=sum[j];
for(int j=(grupa_b-1) * rad + 1 ; j<= b ; ++j)
rez+=v[j];
}
if(grupa_a == grupa_b)
for(int j=a;j<=b;++j)
rez+=v[j];
if(a==b)
rez=v[a];
printf("%d\n",rez);
}
}
return 0;
}