从一道相似题来的,不知为何TLE
#include<iostream>
#include<math.h>
#include<stdio.h>
using namespace std;
const int maxn = 1e5+10;
struct tree
{
int l,r,tag;
long long sum;
}t[4*maxn];
long long line[maxn];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void pushup(int n)
{
t[n].sum = t[n*2].sum + t[n*2+1].sum;
if(t[n*2].tag && t[n*2+1].tag) t[n].tag = 1;
else t[n].tag = 0;
return ;
}
inline int len(int n)
{
return t[n].r - t[n].l + 1;
}
void build(int n,int l,int r)
{
t[n].l = l;
t[n].r = r;
if(l == r)
{
t[n].sum = line[l];
if(line[l] == 0 || line[l] == 1) t[n].tag = 1;
else t[n].tag = 0;
return ;
}
int mid = (l + r) / 2;//midÊôÓÚ×óº¢×Ó
build(n*2,l,mid);
build(n*2+1,mid+1,r);
pushup(n);
return ;
}
void modify(int n,int l,int r)
{
// cout<<"fdsafdasfdsa: "<<n<<' '<<l<<' '<<r<<' '<<t[n].l<<' '<<t[n].r<<endl;
if(t[n].l == t[n].r)
{
t[n].sum = sqrt(t[n].sum);
// cout<<t[n].sum <<endl;
if(t[n].sum == 0 || t[n].sum == 1) t[n].tag = 1;
return ;
}
long long mid = (t[n].l + t[n].r)/2;
if(l <= mid && !t[n*2].tag)
{
modify(n*2,l,mid);
}
if(mid < r && !t[n*2+1].tag)
{
modify(n*2+1,mid+1,r);
}
pushup(n);
return ;
}
long long query(int n,int l,int r)
{
if(t[n].l == l && t[n].r == r)
{
return t[n].sum;
}
long long mid = (t[n].l+t[n].r)/2;
if(r <= mid)
{
return query(n*2,l,r);
}
else if(mid < l)
{
return query(n*2+1,l,r);
}
else
{
return query(n*2,l,mid) + query(n*2+1,mid+1,r);
}
}
int main()
{
int cnt = 1;
int n,m;
while(scanf("%d",&n) != EOF){
printf("Case #%d:\n",cnt);
cnt++;
for(int i=1;i<=n;i++)
{
line[i]=read();
}
build(1,1,n);
m=read();
long long a,b,c;
for(long long i=1;i<=m;i++)
{
a=read();
b=read();
c=read();
if(b > c) swap(b,c);
if(a == 0)
{
modify(1,b,c);
}
else
{
printf("%d\n",query(1,b,c));
}
}
puts("");
}
return 0;
}