求调,不知道哪里出的问题
查看原帖
求调,不知道哪里出的问题
724727
syx13007587508楼主2024/10/20 22:26

一个都没过,呜呜呜……

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#define int long long
#define lc k<<1
#define rc k<<1|1
using namespace std;

const int maxn=3e5+5;
int n,q,c1,c2,w1,w2;
int a[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;
}

struct node
{
	int l;
	int r;
	int mx;
	int sm;
} tree[maxn*4];

void build(int k,int l,int r)
{
	tree[k].l=l;
	tree[k].r=r;
	if(l==r)
	{
		tree[k].sm=a[l];
		tree[k].mx=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(lc,l,mid);
	build(rc,mid+1,r);
	tree[k].sm=tree[lc].sm+tree[rc].sm; 
	tree[k].mx=max(tree[lc].mx,tree[rc].mx); 
}

void update(int k,int i,int v)
{
	if(tree[k].l==tree[k].r&&tree[k].l==i)
	{
		
		tree[k].mx+=v;
		tree[k].sm+=v;
		return;
	}
	int mid=(tree[k].l+tree[k].r)/2;//cout<<"!";
	if(i<=mid)
	{
		update(lc,i,v);
	}
	else
	{
		update(rc,i,v);
	}
	tree[k].sm=tree[lc].sm+tree[rc].sm;
	tree[k].sm=max(tree[lc].sm,tree[rc].sm);
}

int query(int k,int l,int r)
{
	if(tree[k].l>=l&&tree[k].r<=r)
	{
		return tree[k].sm;
	}
	int mid=(tree[k].l+tree[k].r)/2;
	int Sum=0;
	if(l<=mid)
	{
		Sum=Sum+query(lc,l,r);
	}
	if(r>mid)
	{
		Sum=Sum+query(rc,l,r); 
	}
	return Sum;
}

int query_max(int k,int l,int r)
{
	if(tree[k].l>=l&&tree[k].r<=r)
	{
		return tree[k].mx;
	}
	int mid=(tree[k].l+tree[k].r)/2;
	int Max=-0x3f3f3f3f;
	if(l<=mid)
	{
		Max=max(Max,query(lc,l,r));
	}
	if(r>mid)
	{
		Max=max(Max,query(rc,l,r)); 
	}
	return Max;
}

signed main()
{
	//freopen("seq3.in","r",stdin);
	//freopen("seq3.out","w",stdout);
	n=read();
	q=read();
	c1=read();
	c2=read();
	w1=read();
	w2=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	}
	build(1,1,n);
	while(q--)
	{
		int opt=0;
		opt=read();
		if(opt==1)
		{
			
			int x=0,z=0;
			x=read();
			z=read();
			update(1,x,z);
		}
		else if(opt==2)
		{
			int L=0,R=0;
			L=read();
			R=read();
			if(query_max(1,L,R)>w1)
			{
				printf("tetris\n");
				continue;
			}
			int l=-1,r=-1;
			for(int i=L;i+c2<=R;i++)
			{
				if(query(1,i,i+c2)>w2)
				{
					cout<<i<<endl;
					l=i;
					break;
				}
			}
			for(int i=R;i-c2>=L;i--)
			{
				if(query(1,i-c2,i)>w2)
				{
					cout<<i<<endl;
					r=i;
					break;
				}
			}
			cout<<query(1,l,r)<<endl;
			if(l==-1&&r==-1)
			{
				printf("cont\n");
				continue;
			}
			if(r-l+1>c1||query(1,l,r)>w1)
			{
				printf("tetris\n");
				continue;
			}
			else
			{
				printf("cont\n");
				continue;
			}
		}
	}
	return 0;
}
2024/10/20 22:26
加载中...