评测的错误数据本地AC,求助!
查看原帖
评测的错误数据本地AC,求助!
65743
滑稽的小宫楼主2021/1/22 20:25

rt

Wa+Tle,下了一下第一个点的数据,本地运行数据和答案一样,但交上去一直WA……

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#define N 1100010
int n,m;
class Treap{
	public:
	int root,tot;
	class node{
		public:
		int l,r;
		int v,ma,mi,size,dat;
	}a[N];
	Treap(){
		root=tot=0;
		a[0].ma=0x80808080;
		a[0].mi=0x3f3f3f3f;
	}void up(int x){
		if(!x)return;
		a[x].size=a[a[x].l].size+a[a[x].r].size+1;
		a[x].ma=std::max(a[a[x].l].ma,std::max(a[a[x].r].ma,a[x].v));
		a[x].mi=std::min(a[x].v,std::min(a[a[x].l].mi,a[a[x].r].mi));
		return;
	}int newnode(int val){
		a[++tot].v=a[tot].ma=a[tot].mi=val;
		a[tot].size=1;
		a[tot].dat=std::rand();
		return tot;
	}
	void split(int p,int rk,int &x,int &y){
		if(p==0)x=y=0;
		else if(a[a[p].l].size+1>rk)y=p,split(a[p].l,rk,x,a[p].l);
		else x=p,split(a[p].r,rk-a[a[x].l].size-1,a[p].r,y);
		up(p);
	}int merge(int x,int y){
		if(!x||!y)return x+y;
		else if(a[x].dat<a[y].dat){
			a[x].r=merge(a[x].r,y);
			up(x);
			return x;
		}else{
			a[y].l=merge(x,a[y].l);
			up(y);
			return y;
		}
	}
	void insert(int rk,int val){
		int x,y;
		split(root,rk,x,y);
		root=merge(merge(x,newnode(val)),y);
		return;
	}void Delete(int rk){
		int x,y,z;
		split(root,rk,x,z);
		split(x,rk-1,x,y);
		y=merge(a[y].l,a[y].r);
		root=merge(merge(x,y),z);
		return;
	}int getm(int l,int r,bool fl){
		int x,y,z;
		split(root,r,x,z);
		split(x,l-1,x,y);
		int ma=a[y].ma,mi=a[y].mi;
		root=merge(merge(x,y),z);
		return fl?ma:mi;
	}
}bt;
int main(){
	std::srand(time(NULL));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		bt.insert(i,x);
	}for(int i=1;i<=m;i++){
		int opt,x,y;
		scanf("%d%d",&opt,&x);
		if(opt==1)bt.Delete(x);
		else {
			scanf("%d",&y);
			printf("%d %d\n",bt.getm(x,y,0),bt.getm(x,y,1));
		}
	}return 0;
}
2021/1/22 20:25
加载中...