社区讨论
50pts求调
P4145上帝造题的七分钟 2 / 花神游历各国参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lrkqbgpw
- 此快照首次捕获于
- 2024/01/19 22:21 2 年前
- 此快照最后确认于
- 2024/01/20 10:15 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int maxn=5e6+5;
inline int lt(int x){return x*2;}
inline int rt(int x){return x*2+1;}
int n,m;
ll a[maxn];
struct Node{
int l,r;
ll dat;
}tre[8*maxn];
void build(int x,int l,int r){
tre[x].l=l;
tre[x].r=r;
if(l==r){
tre[x].dat=a[l];
return;
}
int mid=(l+r)/2;
build(lt(x),l,mid);
build(rt(x),mid+1,r);
tre[x].dat=tre[lt(x)].dat+tre[rt(x)].dat;
}
void change(int x,int l,int r){
if(r<tre[x].l||tre[x].r<l) return;
if(tre[x].l==tre[x].r){
tre[x].dat=sqrt(tre[x].dat);
return;
}
if(tre[lt(x)].r-tre[lt(x)].l+1!=tre[lt(x)].dat) change(lt(x),l,r);
if(tre[rt(x)].r-tre[rt(x)].l+1!=tre[rt(x)].dat) change(rt(x),l,r);
tre[x].dat=tre[lt(x)].dat+tre[rt(x)].dat;
}
ll ask(int x,int l,int r){
if(r<tre[x].l||tre[x].r<l) return 0;
if(l<=tre[x].l&&tre[x].r<=r){
return tre[x].dat;
}
tre[x].dat=tre[lt(x)].dat+tre[rt(x)].dat;
return ask(lt(x),l,r)+ask(rt(x),l,r);
}
ll Read(){
ll Re=0;
char c=getchar();
while(c<'0'||'9'<c) c=getchar();
while('0'<=c&&c<='9') Re=Re*10+c-'0',c=getchar();
return Re;
}
int main(){
// freopen("P4145_7.in","r",stdin);
// freopen("P4145.ans","w",stdout);
cin >> n;
for(int i=1;i<=n;i++) a[i]=Read();
build(1,1,n);
cin >> m;
while(m--){
ll op,l,r,k;
cin >> op >> l >> r;
if(op==0){
change(1,l,r);
}else{
if(r<l) swap(l,r);
cout << ask(1,l,r) << endl;
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...