Pagini recente » Cod sursa (job #1572710) | Borderou de evaluare (job #1585087) | Cod sursa (job #1252363) | Cod sursa (job #1886316) | Cod sursa (job #3001861)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rest.in");
ofstream fout("rest.out");
int n, m, b, p, ans;
const int NMAX = 250005;
int poz, val, start, finish;
int v[NMAX * 4],put[NMAX];
void update(int nod, int st, int dr)
{
if(st == dr)
{
v[nod] = val % p;
return;
}
int mij = (st + dr) / 2;
if(poz <= mij)
update(2*nod, st, mij);
else
update(2*nod + 1, mij + 1, dr);
v[nod] = (v[2*nod] * put[dr - mij] + v[2*nod + 1]) % p;
}
void afisare(int nod, int st, int dr)
{
if(start <= st && dr <= finish)
{
ans = (ans*put[dr-st+1] % p + v[nod]) % p;
return;
}
int mij = (st + dr) / 2;
if(start <= mij)
afisare(2*nod, st, mij);
if(mij < finish)
afisare(2*nod + 1, mij + 1, dr);
}
int main()
{
int x;
fin >> n >> b >> p;
put[0] = 1;
for(int i = 1; i <= n; i++ )
put[i] = (put[i-1] * b) % p;
for(int i = 1; i <= n; i++)
{
fin >> x;
poz = i;
val = x;
update(1, 1, n);
}
fin >> m;
for(int i = 1; i <= m; i++)
{
fin >> x >> start >> finish;
if(x == 1)
{
poz = start;
val = finish;
update(1, 1, n);
}
else
{
ans = 0;
afisare(1, 1, n);
fout << ans << "\n";
}
}
return 0;
}