Pagini recente » Cod sursa (job #2563666) | Cod sursa (job #1038521) | Cod sursa (job #2840998) | Cod sursa (job #880796) | Cod sursa (job #563332)
Cod sursa(job #563332)
Utilizator |
Smeu Rares Sm3U |
Data |
24 martie 2011 22:26:03 |
Problema |
Datorii |
Scor |
100 |
Compilator |
cpp |
Status |
done |
Runda |
gm_1 |
Marime |
1.55 kb |
#include <stdio.h>
#include <string.h>
using namespace std;
int n;
int m;
int *a;
int *b;
int A;
int B;
int suma;
void cauta(int st, int dr, int nod)
{
if(st>=A && dr<=B)
{
suma+=b[nod];
return;
}
int mij=(st+dr)>>1;
int x=nod<<1;
if(B > mij)
{
cauta(mij+1,dr,x+1);
}
if(A <= mij)
{
cauta(st,mij,x);
}
}
void build(int st, int dr, int nod)
{
if(st==dr)
{
b[nod]=a[st];
return;
}
int mij=(st+dr)>>1;
int x=nod<<1;
build(st,mij,x);
build(mij+1,dr,x+1);
b[nod]=b[x]+b[x+1];
}
void add(int st, int dr, int nod)
{
if(st==dr && st==A)
{
b[nod]-=B;
return;
}
int mij=(st+dr)>>1;
int x=nod<<1;
if(A > mij)
{
add(mij+1,dr,x+1);
}
if(A <= mij)
{
add(st,mij,x);
}
b[nod]=b[x]+b[x+1];
}
void citire()
{
scanf("%d %d",&n,&m);
a=new int[n+5];
b=new int[4*n];
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
}
int main()
{
freopen("datorii.in","r",stdin);
freopen("datorii.out","w",stdout);
citire();
build(1,n,1);
for(int i=0;i<m;i++)
{
int x;
scanf("%d %d %d",&x,&A,&B);
if(x)
{
suma=0;
cauta(1,n,1);
printf("%d\n",suma);
}
else
{
add(1,n,1);
}
}
return 0;
}