逗号的祸

发布时间 2023-05-07 09:01:33作者: ZZQ323

问题代码

报错:
[Error] expected unqualified-id before 'long'
[Note] in expansion of macro 'll'

#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>

#include <iostream>
#include <algorithm>

#include <functional> //“greater”: 未声明的标识符错误
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define ll long long
#define llu long long unsigned
#define mkp make_pair

const int N=1e5+10;
int n,m;
ll a[N]={0};

struct node{
	ll sum;
	ll a0;
	ll d;
} seg[4*N];

node operator+(const node &a,const node &b)
{
	node obj;
	obj.a0=0;
	obj.d=0;
	obj.sum=a.sum+b.sum;
	return obj;
}

void update(int k)
{
	seg[k]=seg[k<<1]+seg[k<<1|1];
}

void set_tag(int k,int len ,ll a0,ll d)
{
	seg[k].sum+=1ll*a0*len+1ll*len*(len-1)*d/2;
	seg[k].d+=d;
	seg[k].a0+=a0;
}

void push_down(int k,int len)//len ->个数  
{
	ll a0=seg[k].a0;
	ll d=seg[k].d;
	ll len0=len+1>>1;
	set_tag(k<<1,len+1>>1,a0,d);
	set_tag(k<<1|1,len>>1,a0+d*(len0),d);
	seg[k].a0=0;
	seg[k].d=0;
}

void init(int k,int l,int r)
{
	if(l==r){
		seg[k].sum=a[l];
		seg[k].a0=0;
		seg[k].d=0;
	}else{
		int mid=l+r>>1;
		init(k<<1,l,mid);
		init(k<<1|1,mid+1,r);
		update(k);
	}
}

void modify(int k,int l,int r,int ql,int qr,ll a0,ll d)
{
//	printf("k = %d l = %d r = %d a0 = %d d = %d\n",k,l,r,a0,d);
	if(l==ql && qr==r){
		set_tag(k,r-l+1,a0,d);
	}else{
		if(seg[k].a0 || seg[k].d)
			push_down(k,r-l+1);
		int mid=l+r>>1;
		int len0=(mid-ql+1);
		if(qr<=mid)modify(k<<1,l,mid,ql,qr,a0,d);
		else if(ql>mid)modify(k<<1|1,mid+1,r,ql,qr,a0,d);
		else modify(k<<1,l,mid,ql,mid,a0,d),modify(k<<1|1,mid+1,r,mid+1,qr,a0+len0*d,d);
		update(k);
	}
}

node check(int k,int l,int r,int pos)
{
//	printf("k = %d l = %d r = %d a0 = %d d = %d\n",k,l,r,a0,d);
	if(l==pos && r==pos){
		return seg[k];
	}else{
		if(seg[k].a0 || seg[k].d)
			push_down(k,r-l+1);
		int mid=l+r>>1;
		if(pos<=mid)return check(k<<1,l,mid,pos);
		else if(pos>mid)return check(k<<1|1,mid+1,r,pos);
	}
}


int main(int argc, char** argv)
{
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	
	init(1,1,n);
		
	while(m--){
		int op;
		scanf("%d",&op);
		
		int l,r,
		ll K,D;
		int p;
		switch(op){
			case 1:
				
				scanf("%d%d%lld%lld",&l,&r,&K,&D);
				modify(1,1,n,l,r,K,D);
				break;
			case 2:
				
				scanf("%d",&p);
				printf("%lld\n",check(1,1,n,p).sum);
				break;
		}
		
//		for(int k=1;k<=10;k++)
//			printf("%d:a0 = %d d = %d sum = %lld\n",k,seg[k].a0,seg[k].d,seg[k].sum) ;
		
	}
	
	return 0;
}

原因:

int l,r,//这里不能加逗号
ll K,D;//要不然ll也是一个变量,导致宏ll违法