Pagini recente » Cod sursa (job #711442) | Cod sursa (job #1836441) | Cod sursa (job #1777728) | Cod sursa (job #484159) | Cod sursa (job #1498917)
#include <iostream>
#include <fstream>
#define NMAX 1503
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int n,m,v[NMAX],val,poz,t,a,b,sum,aib[NMAX];
void citire()
{
in >> n >> m;
for(int i=1;i<=n;i++)
in >> v[i];
}
void update(int poz, int x)
{
for(int i=poz; i<=n; i=i+(i&(-i)))
aib[i]=aib[i]+x;
}
int query(int i)
{
int s=0;
for(s=0; i; i=i-(i&(-i)))
s=s+aib[i];
return s;
}
int main()
{
citire();
for(int i=1;i<=n;i++)
{
poz = i;
val = v[i];
update(poz,val);
}
for(int i=0;i<m;i++)
{
in>> t >> a >> b;
if(t==0)
{
poz = a;
val = b;
update(poz,-val);
}
else
{
sum = 0;
sum = query(b) - query(a-1);
out << sum << "\n";
}
}
return 0;
}
/*
#include <iostream>
#include <fstream>
#define NMAX 1503
#define NN 1 << 11
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int n,m,v[NMAX],intervale[NN],val,poz,t,a,b,sum;//aib[NMAX];
inline void citire()
{
in >> n >> m;
for(int i=1;i<=n;i++)
in >> v[i];
}
inline void updateI(int nod,int st, int dr)
{
int mij;
if(st==dr)
{
intervale[nod] = intervale[nod] + val;
return;
}
mij = (st+dr)/2;
if(poz<=mij)
{
updateI(nod*2,st,mij);
}
else if(poz>mij)
{
updateI(nod*2+1,mij+1,dr);
}
intervale[nod] = intervale[nod*2]+intervale[2*nod+1];
}
inline void getsumI(int nod,int st,int dr)
{
int mij;
if(a<=st && dr<=b)
{
sum = sum + intervale[nod];
return;
}
mij = (st+dr)/2;
if(mij>=a) getsumI(nod*2,st,mij);
if(mij<b) getsumI(nod*2+1,mij+1,dr);
}
int main()
{
citire();
for(int i=1;i<=n;i++)
{
poz = i;
val = v[i];
updateI(1,1,n);
}
// for(int i=1;i<=13;i++)
//{
// cout << i << " " << intervale[i] << endl;
// }
for(int i=0;i<m;i++)
{
in>> t >> a >> b;
if(t==0)
{
poz = a;
val = (-1)*b;
updateI(1,1,n);
}
else
{
sum = 0;
getsumI(1,1,n);
out << sum << "\n";
}
}
return 0;
}
*/