小菜鸡的线段树炸成67pts,好心人救救我呀。
各位路过的神犇求助。
代码如下
#2,#3炸了,WA,没有TLE的。
#include <cstdio>
#define ll long long
#include <algorithm>
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
void read(ll &x){//读优
char c=getchar();
int k=1;
while(c<'0'||c>'9') {if(c=='-') k=-1;c=getchar();}
for(x=0;c>='0'&&c<='9';c=getchar())
x=x*10+c-'0';
x*=k;
}
#define N 1000001
#define mod 317847191
ll n,m,l,r,k;
ll a[N];
ll tree[N*4];//线段树
ll s,ans,p,q;
char ch[2];
bool ok[N];
void build(int k,int l,int r){//建树
if(l==r){
tree[k]=a[l];
return;
}
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tree[k]=tree[k<<1]*tree[k<<1|1]%mod;
}
//区间求积
ll query(int k,int l,int r,int x,int y){
if(l>r) return 1;
if(l>y||r<x) return 1;
if(x<=l&r<=y) return tree[k]%mod;
ll s=1;
int mid=l+r>>1;
s*=query(k<<1,l,mid,x,y)*query(k<<1|1,mid+1,r,x,y);
s%=mod;
return s;
}
//单点修改
void change(int k,int l,int r,int x){
if(l>r) return;
if(l>x||r<x) return;
if(l==r&&l==x){
tree[k]=1;
return;
}
int mid=l+r>>1;
change(k<<1,l,mid,x);
change(k<<1|1,mid+1,r,x);
tree[k]=tree[k<<1]*tree[k<<1|1]%mod;
}
//快速幂
ll pow(ll x,ll n){
ll y=1;
while(n){
if(n&1){
y*=x;y%=mod;
}
x*=x;
n>>=1;
}
return y;
}
int main(){
read(n);read(m);
for(int i=1;i<=n;i++){
read(a[i]);
}
sort(a+1,a+n+1);//先排序
build(1,1,n);
l=1;r=n;//双指针
while(m--){
scanf("%s",ch+1);
if(ch[1]=='D'){
read(k);
if(a[l]==k){
l++;continue;
}
if(a[r]==k){
r--;continue;
}
p=lower_bound(a+1,a+n+1,k)-a;
//找到要删除的位置变成一
change(1,1,n,p);
}
if(ch[1]=='B'){
printf("%lld\n",a[r]);
}
if(ch[1]=='S'){
printf("%lld\n",a[l]);
}
if(ch[1]=='M'){
p=a[l];q=a[r];
printf("%lld\n",pow(q,p));
}
if(ch[1]=='T'){
printf("%lld\n",query(1,1,n,l,r));
}
}
return 0;
}