点更新,区间查询
点最多更新7次,若r-l+1==sum[o],直接返回
这个题的坑真多
一开始一直超时
换成Long long 就不超时 ???
不应该Wa吗
不对,应该直接溢出,变成负数了,就取根号没效果了,就超时了。。
每个样例要有换行
最后x,y的大小不固定,要注意这一点
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=100005;
long long a[maxn];
long long sum[maxn*4];
int t,x,y;
void Build(int o,int l,int r)
{
if(l==r) {
sum[o]=a[l]; return ;
}
int mid=l+r>>1;
Build(o<<1,l,mid);
Build(o<<1|1,mid+1,r);
sum[o]=sum[o<<1]+sum[o<<1|1];
}
void Update(int o,int l,int r)
{
if(x<=l&&r<=y&&r-l+1==sum[o]) {
return ;
}
if(l==r) {
sum[o]=sqrt(sum[o]);
return ;
}
int mid=l+r>>1;
if(x<=mid) {
Update(o<<1,l,mid);
}
if(y>mid) {
Update(o<<1|1,mid+1,r);
}
sum[o]=sum[o<<1]+sum[o<<1|1];
}
long long Query(int o,int l,int r)
{
long long ans=0;
if(x<=l&&r<=y) {
return sum[o];
}
int mid=l+r>>1;
if(x<=mid) {
ans+=Query(o<<1,l,mid);
}
if(y>mid) {
ans+=Query(o<<1|1,mid+1,r);
}
return ans;
}
int main()
{
int n;
int cnt=0;
while(~scanf("%d",&n)) {
for(int i=1;i<=n;i++) {
scanf("%lld",&a[i]);
}
Build(1,1,n);
int m;
printf("Case #%d:\n",++cnt);
scanf("%d",&m);
while(m--) {
scanf("%d%d%d",&t,&x,&y);
if(y<x) swap(x,y);
if(t==0) {
Update(1,1,n);
}
else{
printf("%lld\n",Query(1,1,n));
}
}
printf("\n");
}
}