Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- ll n,q;
- ll a[100000];
- ll b[100000];
- ll treeP[400004];
- ll treeS[400004];
- bool primes[100000];
- vector<ll> ans;
- ll complite(ll x)
- {
- for(ll i=2;i<=x;i++){
- primes[i]=true;
- }
- for(ll i=2;i<=x;i++){
- for(ll j=i*i;j<=x;j+=i){
- primes[j]=false;
- }
- }
- }
- void build_treeP(ll v, ll tl, ll tr)
- {
- if(tl==tr){
- treeP[v]=b[tl];
- }else{
- ll tm=(tl+tr)/2;
- build_treeP(v*2,tl,tm);
- build_treeP(v*2+1,tm+1,tr);
- treeP[v]=treeP[v*2]+treeP[v*2+1];
- }
- }
- void build_treeS(ll v, ll tl, ll tr)
- {
- if(tl==tr){
- treeS[v]=a[tl];
- }else{
- ll tm=(tl+tr)/2;
- build_treeS(v*2,tl,tm);
- build_treeS(v*2+1,tm+1,tr);
- treeS[v]=treeS[v*2]+treeS[v*2+1];
- }
- }
- ll get_sumP(ll l, ll r, ll v, ll tl, ll tr)
- {
- if(l<=tl&&tr<=r){
- return treeP[v];
- }
- if(tr<l || r<tl){
- return 0;
- }
- ll tm=(tl+tr)/2;
- return get_sumP(l,r,v*2,tl,tm)+get_sumP(l,r,v*2+1,tm+1,tr);
- }
- ll get_sumS(ll l, ll r, ll v, ll tl, ll tr)
- {
- if(l<=tl&&tr<=r){
- return treeS[v];
- }
- if(tr<l || r<tl){
- return 0;
- }
- ll tm=(tl+tr)/2;
- return get_sumS(l,r,v*2,tl,tm)+get_sumS(l,r,v*2+1,tm+1,tr);
- }
- void updateP(ll idx, ll val, ll v, ll tl, ll tr)
- {
- if(idx<=tl&&tr<=idx){
- b[idx]=val;
- treeP[v]=val;
- return;
- }
- if(idx<tl || idx>tr){
- return;
- }
- ll tm=(tl+tr)/2;
- updateP(idx,val,v*2,tl,tm);
- updateP(idx,val,v*2+1,tm+1,tr);
- treeP[v]=treeP[v*2]+treeP[v*2+1];
- }
- void updateS(ll idx, ll val, ll v, ll tl, ll tr)
- {
- if(idx<=tl&&tr<=idx){
- a[idx]=val;
- treeS[v]=val;
- return;
- }
- if(idx<tl || idx>tr){
- return;
- }
- ll tm=(tl+tr)/2;
- updateS(idx,val,v*2,tl,tm);
- updateS(idx,val,v*2+1,tm+1,tr);
- treeS[v]=treeS[v*2]+treeS[v*2+1];
- }
- int32_t main() {
- cin>>n;
- complite(100000);
- for(ll i=0;i<n;i++){
- ll temp; cin>>temp;
- if(primes[temp]){
- b[i]=temp;
- a[i]=0;
- }else{
- a[i]=temp;
- b[i]=0;
- }
- }
- build_treeP(1,0,n-1);
- build_treeS(1,0,n-1);
- cin>>q;
- for(ll i=0;i<q;i++){
- ll type; cin>>type;
- if(type==1){
- ll idx,val; cin>>idx>>val; idx--;
- if(primes[val]){
- updateP(idx,val,1,0,n-1);
- updateS(idx,0,1,0,n-1);
- }else{
- updateS(idx,val,1,0,n-1);
- updateP(idx,0,1,0,n-1);
- }
- }
- if(type==2){
- ll l,r; cin>>l>>r; l--; r--;
- ans.push_back(get_sumP(l,r,1,0,n-1));
- }
- if(type==3){
- ll l,r; cin>>l>>r; l--; r--;
- ans.push_back(get_sumS(l,r,1,0,n-1));
- }
- }
- for(ll u : ans){
- cout<<u<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement