您的位置:首页 > 其它

[BZOJ 3211] 花神游历各国

2016-03-14 16:36 363 查看
每次把一段区间变成根号。

查询一段区间的和

Po姐的题解QAQ

#include
#include
#include
#include
#include
#define maxn 100010
using namespace std;
int n;

typedef long long ll;

void read(int &num){
num = 0;char ch = getchar();
for(; ch < '!'; ch = getchar());
for(; ch > '!'; ch = getchar())
num = (num << 3) + (num << 1) + (ch ^ 48);
}

int a[maxn], fa[maxn];

int getfa(int x){
if(x == fa[x] || fa[x] == 0)
return fa[x] = x;
return fa[x] = getfa(fa[x]);
}

ll t[maxn];

#define lowbit(i) i & ((~i) + 1)

void update(int pos, int val){
for(int i = pos; i <= n; i += lowbit(i))
t[i] += val;
}

ll ask(int pos){
if(pos == 0)return 0;
ll ret = 0;
for(int i = pos; i; i -= lowbit(i))
ret += t[i];
return ret;
}

void Modify(int l, int r){
for(int i = l; i <= r; i = getfa(i + 1)){
int New = sqrt(a[i]);
update(i, New - a[i]);
a[i] = New;
if(a[i] <= 1)
fa[i] = getfa(i + 1);
}
}

int main(){
read(n);
for(int i = 1; i <= n; i ++){
read(a[i]);
if(a[i] <= 1)
fa[i] = i + 1;
update(i, a[i]);
}
int m;
read(m);
int x, l, r;
for(int i = 1; i <= m; i ++){
read(x), read(l), read(r);
if(x == 1)printf("%lld\n", ask(r) - ask(l - 1));
else Modify(l, r);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: