Pagini recente » Cod sursa (job #2089118) | Cod sursa (job #3207511) | Cod sursa (job #2671611) | Cod sursa (job #2490106) | Cod sursa (job #854674)
Cod sursa(job #854674)
#include <fstream>
#include <iostream>
#define nmax 15001
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int v[nmax];
int smen[150];
int n,m;
int rada=0;
void get_data(){
in>>n>>m;
for (int i=1;i<=n;i++)
in>>v[i];
}
int radacina(int n){
int i=1;
while (i*i<=n) i++;
/*if (i*i==n) return i ;
else */return --i;
}
void transform(){
int i,j;
j=1;
for (i=1;i<=n;i++){
smen[j]+=v[i];
if (i==j*rada)
j++;
}
}
void refresh(int a, int suma){
v[a]-=suma;
int ok=0;//inca nu am gasit zona
int zona=1;//suntem in zona 1
int st=1;
int dr=st+rada-1;
while ((ok==0)&&(st<=n)){
if ((st<=a) && (a<=dr)){
//iii am gasit zona:))
smen[zona]-=suma;ok=1;
}
zona++;
st=dr+1;
dr=dr+rada;
}
}
int ask(int x, int y) { //suma din intervalul x,y
int st=1;
int zona=1;
int suma=0;
int dr=rada+st-1;
int x1,y1;
while (st<=n){
if (st>=x) x1=st; //.x..st=x1
else x1=x; /// st..x=x1
if (dr<=y) y1=dr; //y2=dr...y
else y1=y; ///y2=y....dr
if (y1>n) y1=n;
if ((x1==st) && (y1==dr)) suma+=smen[zona];
else
{
for(int j=x1;j<=y1;j++) suma+=v[j];
}
st=dr+1;
dr+=rada;
zona++;
}
return suma;
}
int main()
{ int a,b,op;
get_data();
rada=radacina(n);
transform();
for (int i=1;i<=m;i++){
in>>op>>a>>b;
if (op==0) refresh(a,b);
else out<<ask(a,b)<<'\n';
}
return 0;
}