大佬求助,蒟蒻不知道错哪了qwq
查看原帖
大佬求助,蒟蒻不知道错哪了qwq
62181
紫刃楼主2021/10/29 09:36
#include<bits/stdc++.h>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)

using namespace std;

long long dis[100005];
int n,m,ant;
long long s1,s2,s3;
int ll[1000005];
int rr[1000005];
long long val[1000005];
bool qq[1000005];

inline long long read() {
	long long kk= 0, zz = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') {
			zz = -1;
		}
		ch = getchar();
	}
	while (ch>= '0' && ch <= '9') {
		kk = (kk<< 1) + (kk << 3) + (ch ^ 48);
		ch = getchar();
	}
	return kk * zz;
}

void jian(int q,int w,int e) {
	ll[q] = w;
	rr[q] = e;
	if (w == e) {
		val[q] = dis[++ant];
		return;
	}
	int mid = (w + e) / 2;
	jian(ls(q),w,mid);
	jian(rs(q),mid + 1,e);
	val[q] = val[ls(q)] + val[rs(q)];
}

long long cha(int now,int l,int r) {
	if (ll[now] >= l && rr[now] <= r) {
		return val[now];
	}
	long long s = 0;
	int mid = (ll[now] + rr[now]) / 2;
	if (l <= mid) s += cha(ls(now),l,r);
	if (r > mid) s += cha(rs(now),l,r);
	return s;
}

void add(int now,int l,int r) {
	if (qq[now]) return;
	if (ll[now] == rr[now]) {
		val[now] = sqrt(val[now]);
		if (val[now] < 1) qq[now] = true;
		return;
	}
	int mid = (ll[now] + rr[now]) / 2;
 	if (mid >= l) add(ls(now),l,r);
	if (r > mid) add(rs(now),l,r);
	val[now] = val[ls(now)] + val[rs(now)];
	qq[now] = (qq[ls(now)] && qq[rs(now)]); 
}

int main() {
	scanf("%d",&n);
	for (int j = 1; j <= n; j++) {
		dis[j] = read();
	}
	jian(1,1,n);
	scanf("%d",&m);
	for (int j = 1; j <= m; j++) {
		s1 = read();
		s2 = read();
		s3 = read();
		if (s2 > s3) {
			swap(s2,s3);
		}
		if (s1 == 1) {
			printf("%lld\n",cha(1,s2,s3));
		}
		else{
			add(1,s2,s3);
		}	
	}
	return 0;
}
2021/10/29 09:36
加载中...