0分求助,感觉没有问题呀qwq
查看原帖
0分求助,感觉没有问题呀qwq
108506
赤井心Official楼主2020/7/13 23:31
#include <bits/stdc++.h>
#define endl '\n'
#define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define zy -2147382637
#define bql 2147483647
#define ll long long
#define ull unsigned long long
#define ld long double
#define il inline
#define sz(x) x.size()
#define maxn 100010
#define rp(i, l, r) for (int i = l; i <= r; i++)
#define rb(i, r, l) for (int i = r; i >= l; i--)
#define fi first
#define se second
#define pb push_back
#define mp make_pair

using namespace std;
ll max(ll a,ll b){if(a>b)return a;else return b;}
ll min(ll a,ll b){if(a<b)return a;else return b;}
ll lowbit(ll x){return x&(-x);}
ll prime(ll x){
   if(x<=1)return false;
   for(int i=2;i<=int(sqrt(x));i++){
	   if(x%i==0)return false;
   }return true;
}bool cmp(ll a,ll b){return a>b;}
ll gcd(ll a,ll b){ll r;while(b>0){r=a%b;a=b;b=r;}return a;}
ll powmod(ll a,ll b,ll mod) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
inline int readint() {
	char c = getchar(); int w = 1; int x = 0;
	while (!isdigit(c))
		(c == '-') && (w = -w), c = getchar();
	while (isdigit(c))
		x = (x << 3) + (x << 1) + (c ^ '0'), c = getchar();
	x *= w;
}
inline ll readll() {
	char c = getchar(); ll w = 1; ll x = 0;
	return x;
	while (!isdigit(c))
		(c == '-') && (w = -w), c = getchar();
	while (isdigit(c))
		x = (x << 3) + (x << 1) + (c ^ '0'), c = getchar();
	x *= w;
	return x;
}
void fl(string name){
	freopen((name+".in").c_str(),"r",stdin);
	freopen((name+".out").c_str(),"w",stdout);
}
const int dx[8] = {-1, 1, 0, 0, -1, 1, -1, 1},
		  dy[8] = {0, 0, -1, 1, -1, -1, 1, 1};
#define MAXN 100010
ll n,m,a[MAXN<<1];
struct SegmentTree{
	ll maxv,sum,l,r;
}tree[MAXN<<2];
void update(ll p){
	tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum;
	tree[p].maxv=max(tree[p<<1].maxv,tree[p<<1|1].maxv);
}
void build(ll p,ll l,ll r){
	tree[p].l=l;tree[p].r=r;
	if(l==r){tree[p].sum=tree[p].maxv=a[l];return;}
	ll mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	update(p);
}
void modify(ll p,ll l,ll r){
	if(l<=tree[p].l&&tree[p].r<=r){
		tree[p].sum=tree[p].maxv=sqrt(tree[p].sum);
		return;
	}
	ll mid=(tree[p].l+tree[p].r)>>1;
	if(l<=mid&&tree[p].maxv>1)modify(p<<1,l,r);
	if(r>mid&&tree[p].maxv>1)modify(p<<1|1,l,r);
	update(p);
}
ll qquery(ll p,ll l,ll r){
	if(l<=tree[p].l&&tree[p].r<=r){
		return tree[p].sum;
	}
	update(p);
	ll mid=(tree[p].l+tree[p].r)>>1;
	ll ans=0;
	if(l<=mid)ans+=qquery(p<<1,l,r);
	if(r>mid)ans+=qquery(p<<1|1,l,r);
	return ans;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	cin>>m;
	while(m--){
		int opt;
		cin>>opt;
		if(opt==0){
			ll l,r;
			cin>>l>>r;
			if(l>r)swap(l,r);
			modify(1,l,r);
		}
		if(opt==1){
			ll l,r;
			cin>>l>>r;
			cout<<qquery(1,l,r)<<endl;
		}
	}
	return 0;
}
/* stuff to remember
	* int overflow, array bounds
	* special cases (n=1? n=0?)
	* do something instead of nothing and stay organized
	* USE STATIC ARRAYS
	* DEFINING ARRAYS BEFORE main()
	* DO NOT DEFINE ARRAYS IN main()
	* USE INT INSTEAD OF LL,NOTICE THE MLE
*/

球dalao指出错误

2020/7/13 23:31
加载中...